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
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);
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);
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.
You can try to enable the antialiasing on the complete Widget :
QGLWidget::setFormat(QGLFormat(QGL::SampleBuffers));