Qt + OpenGL:如何正确覆盖QOpenGLWidget :: resizeEvent?

时间:2018-10-27 21:09:53

标签: c++ qt opengl

似乎QOpenGLWidget::paintEventQOpenGLWidget::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绘制的文本)的高度较小,字母看起来像压缩后,抗锯齿功能也无法正常使用。您可以在图片上看到它,在文本上看到它,不要注意彩色区域。

enter image description here

所以我有2个问题:

1)尽管渲染(不调整大小)效果很好,但是我是否会错过覆盖的paintEvent中的某些呼叫?

2)我应将哪些调用添加到覆盖的resizeEvent中,哪些应在基类resizeEvent中进行调用?

UPD:我想出了一个简单的想法,只是打开qopenglwidget.cpp源代码,并查看其工作原理并根据我的需要进行修复,有一天我会尝试一下。

2 个答案:

答案 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源代码,并查看其工作方式并根据我的需要进行修复,我有一天会尝试使用它。