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


我试图在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);

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


12
2018-06-10 18:50


起源


您的系统是否支持多重采样帧缓冲区? - cmannett85
是的,它是Windows 7,我已经让它在另一个使用QGLWidget而没有QPainter的Qt项目上工作,只需启用GL_MULTISAMPLE。 - Elliott
事实上它是Windows 7是无关紧要的,它是你的GPU和驱动程序是否支持它们 - 但是如果是另一个项目 在同一台机器上 工作正常然后一定没问题。你的例子似乎暗示你正试图在一个小部件之外绘制 paintEvent(QPaintEvent* event),还是只是混淆伪代码!? - cmannett85


答案:


我找到了解决方案。在调试另一个问题时,我在调试输出中发现了一些消息,即在调用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);

11
2018-06-21 15:19





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

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


8
2018-06-11 13:22



简单,无创,工作完美! - BenC
完美的工作。请注意,您仍然需要 setRenderHint(QPainter::Antialiasing)。 - Timmmm


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

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

3
2018-05-22 10:49



太好了,谢谢 - Semyon Tikhonenko