Какие шаги необходимы для включения сглаживания при использовании 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++.