15

我正在尝试在 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

4 回答 4

16

我找到了解决方案。在调试其他问题时,我在调试输出中发现消息表明您无法在调用 begin() 之前设置渲染提示。

以下作品:

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);
于 2012-06-21T15:19:24.657 回答
10

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

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

于 2012-06-11T13:22:19.147 回答
6

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

QOpenGLWidget* gl = new QOpenGLWidget;
QSurfaceFormat fmt;
fmt.setSamples(8);
gl->setFormat(fmt);
setViewport(gl);
setRenderHint(QPainter::Antialiasing);
于 2017-05-22T10:49:53.637 回答
1

如果你在 PyQt5 上工作,你通常会继承子类QOpenGLWidget()来构建你自己的 GPU 驱动的小部件。要打开抗锯齿,请查看下面的代码片段:

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class MyFigureClass(QOpenGLWidget):
    def __init__(self, parent):
        super().__init__(parent)
        fmt = QSurfaceFormat()    # -╷
        fmt.setSamples(8)         #  > anti-aliasing
        self.setFormat(fmt)       # -╵
        [...]

    def paintEvent(self, event):
        qp = QPainter()
        qp.begin(self)
        qp.setRenderHint(QPainter.Antialiasing)
        [...]
        qp.end()

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

于 2019-09-23T16:50:41.273 回答