似乎QOpenGLWidget::paintEvent
和QOpenGLWidget::resizeEvent
做着不需要的glClear
。
我不想在每次paintGL
调用之前清除屏幕,但是Qt会自动清除它,因此我像这样覆盖了QOpenGLWidget::paintEvent
:
void GlWidget::paintEvent(QPaintEvent* event)
{
makeCurrent();
paintGL();
paintWithQPainter();
}
似乎工作正常。
然后,我尝试覆盖QOpenGLWidget::resizeEvent
(在这里我不需要致电glViewPort
)
void GlWidget::resizeEvent(QResizeEvent* event)
{
// QWidget::resizeEvent(event); // i've also tried this, doesn't help
resizeGL(event->size().width(), event->size().height());
}
调整窗口大小时,出现了问题,例如:如果减小窗口的高度,则绘制的文本(在QPainter
之后使用paintGL
绘制的文本)的高度较小,字母看起来像压缩后,抗锯齿功能也无法正常使用。您可以在图片上看到它,在文本上看到它,不要注意彩色区域。
所以我有2个问题:
1)尽管渲染(不调整大小)效果很好,但是我是否会错过覆盖的paintEvent
中的某些呼叫?
2)我应将哪些调用添加到覆盖的resizeEvent
中,哪些应在基类resizeEvent
中进行调用?
UPD:我想出了一个简单的想法,只是打开qopenglwidget.cpp源代码,并查看其工作原理并根据我的需要进行修复,有一天我会尝试一下。
答案 0 :(得分:1)
好像您必须在代码之前或之后调用原始的resizeEvent。
void GlWidget::resizeEvent(QResizeEvent* event)
{
//your code...
QOpenGLWidget::resizeEvent(event);
}
答案 1 :(得分:0)
我在Qt论坛上有一个答案:https://forum.qt.io/topic/96016/how-to-properly-override-qopenglwidget-resizeevent
有人告诉我,如果我想防止glClear
之间的paintEvent
,我需要打电话给QOpenGLWidget::setUpdateBehavior(QOpenGLWidget::PartialUpdate)
。
对于调整大小-调整大小事件很少见,因此最好不要通过覆盖QOpenGLWidget
(重新创建内部FBO并设置一堆内部状态)来弄乱resizeEvent
状态尝试在调整大小后阻止不重要的glClear
调用。
UPD :我想出了一个简单的想法,只是打开qopenglwidget.cpp源代码,并查看其工作方式并根据我的需要进行修复,我有一天会尝试使用它。