在QGLWidget上使用QPainter时,启用抗锯齿需要哪些步骤?

时间:2012-06-10 18:50:08

标签: qt opengl

我正在尝试在QGLWidget上绘制基本形状。我正在尝试启用抗锯齿来平滑线条,但它无法正常工作。

这就是我现在正在尝试的事情:

QGLWidget *widget = ui->renderWidget;

QPainter painter;

widget->makeCurrent();
glEnable(GL_MULTISAMPLE);
glEnable(GL_LINE_SMOOTH);

painter.setRenderHint(QPainter::Antialiasing);
painter.setRenderHint(QPainter::HighQualityAntialiasing);

painter.begin(widget);

然而,用这位画家绘制的任何东西仍然有锯齿状的边缘。我还需要做什么?

4 个答案:

答案 0 :(得分:13)

我找到了解决方案。在调试另一个问题时,我在调试输出中发现了一些消息,即在调用begin()之前无法设置renderhints。

以下作品:

QGLWidget *widget = ui->renderWidget;

QPainter painter;

widget->makeCurrent();
glEnable(GL_MULTISAMPLE);
glEnable(GL_LINE_SMOOTH);

painter.begin(widget);

painter.setRenderHint(QPainter::Antialiasing);
painter.setRenderHint(QPainter::HighQualityAntialiasing);

答案 1 :(得分:8)

您可以尝试在完整的小部件上启用抗锯齿:

QGLWidget::setFormat(QGLFormat(QGL::SampleBuffers));

答案 2 :(得分:3)

这个问题相当陈旧,但我仍然在Google上找到了它。 您不应再使用QGLWidget使用较新的QOpenGLWidget。这会将场景渲染到屏幕外,而不是创建一个原生的OpenGL窗口,这会导致调整布局大小的各种问题。这段代码适合我。把它放在你的QGraphicsView构造函数中:

QOpenGLWidget* gl = new QOpenGLWidget;
QSurfaceFormat fmt;
fmt.setSamples(8);
gl->setFormat(fmt);
setViewport(gl);
setRenderHint(QPainter::Antialiasing);

答案 3 :(得分:0)

如果您使用PyQt5,则通常会子类SHA1来构建自己的GPU驱动的小部件。要打开抗锯齿功能,请查看下面的代码段:

QOpenGLWidget()

注意:谢谢@Timmmm的回答。在查看您的C ++代码片段时,我找到了PyQt5解决方案。