Какие шаги необходимы для включения сглаживания при использовании QPainter в QGLWidget?

Я пытаюсь нарисовать основные фигуры на 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);

Однако, все, что нарисовано этим художником, все еще имеет зубчатые края. Что еще мне нужно сделать?

Ответ 1

Я нашел решение. При отладке другой проблемы я обнаружил сообщения в своем отладочном выводе, что вы не можете установить renderhints перед вызовом 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);

Ответ 2

Вы можете попытаться включить сглаживание на полном виджете:

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

Ответ 3

Этот вопрос довольно старый, но я все еще нашел его в Google. Вам больше не следует использовать QGLWidget. Используйте новый QOpenGLWidget. Это делает сцену вне экрана, а не создает собственное окно OpenGL, которое вызывает всевозможные проблемы с изменением размера макетов. Этот код работает для меня. Поместите его в свой конструктор QGraphicsView:

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

Ответ 4

Если вы работаете с PyQt5, вы, как правило, будете создавать подклассы QOpenGLWidget() для создания собственного виджета с графическим процессором. Чтобы включить сглаживание, взгляните на фрагмент кода ниже:

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 за ответ. Я нашел решение PyQt5, глядя на ваши фрагменты кода C++.