What steps are necessary to enable antialiasing when using a QPainter on a QGLWidget?

前端 未结 4 1885
情深已故
情深已故 2020-12-10 03:43

I am trying to draw basic shapes on a QGLWidget. I am trying to enable antialiasing to smooth out the lines, but it is not working.

This is what I am trying at the m

相关标签:
4条回答
  • 2020-12-10 04:20

    This question is quite old but I still found it on Google. You shouldn't use QGLWidget any more. Use the newer QOpenGLWidget. This renders the scene off-screen rather than creating a native OpenGL window which causes all sorts of issues with resizing layouts. This code works for me. Put it in your QGraphicsView constructor:

    QOpenGLWidget* gl = new QOpenGLWidget;
    QSurfaceFormat fmt;
    fmt.setSamples(8);
    gl->setFormat(fmt);
    setViewport(gl);
    setRenderHint(QPainter::Antialiasing);
    
    0 讨论(0)
  • 2020-12-10 04:23

    I found the solution. When debugging a different issue, I found messages in my debug output to the effect that you can't set renderhints before the call to begin().

    The following works:

    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);
    
    0 讨论(0)
  • 2020-12-10 04:27

    If you work on PyQt5, you will typically subclass QOpenGLWidget() to build your own GPU-powered widget. To turn on anti-aliasing, have a look at the code snippet below:

    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()
    

    Note: Thank you @Timmmm for your answer. I found the PyQt5 solution when looking at your C++ code snippets.

    0 讨论(0)
  • 2020-12-10 04:29

    You can try to enable the antialiasing on the complete Widget :

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

    0 讨论(0)
提交回复
热议问题