QGLWidget渲染区域未正确调整大小

时间:2016-07-03 21:04:20

标签: c++ qt opengl

我正在使用Qt开发OpenGL应用程序。直到昨天我才继续QOpenGLWidget创建我的自定义窗口小部件,但是在将它添加到主应用程序之后,这是一个带有几个按钮和三个QMainWindow的{​​{1}},它运行得非常慢。我尝试使用QGraphicsView,应用程序的运行方式与没有OpenGL小部件的情况相同。

我遇到的问题是我做的子类化QGLWidget的小部件没有正确调整大小(或者至少OpenGL渲染区域没有)。

我将使用Qt 5.5中的hellogl2示例给你一个例子。

使用QGLWidget我得到:

https://s32.postimg.org/u136s54ld/QOpen_GLWidget.png

使用QOpenGLWidget我得到:

https://s32.postimg.org/ahylis5tt/QGLWidget.png

我刚刚将父类从QGLWidget更改为QOpenGLWidget,其余代码是相同的。同样的事情发生在我的应用中。

我试图找到解决方案,但我做不到。有人可能会告诉我为什么会发生这种情况以及如何解决它?

谢谢!

1 个答案:

答案 0 :(得分:1)

首先,最好坚持使用最新的方法,远离@ddriver建议的删除代码。

说过我用QGLWidget写了很多代码,没有问题。它完成了我需要的一切,所以我现在坚持下去。

以下是您的方法的主要问题。您从qt 5.5获取了hellogl示例,并简单地将父级从QOpenGLWidget替换为QGLWidget。不幸的是,他们不会同样处理调整大小事件。

QOpenglGLWidget确实会根据resize事件给出的宽度和高度更改视口,如文档中所提到的那样(不是很清楚,带有双重否定)。链接:http://doc.qt.io/qt-5/qopenglwidget.html#resizeGL 检查函数resizeEvent(),然后调用resizeGL()

现在,QGL小部件不会为您执行此操作。它所做的只是使opengl上下文变为当前,这意味着你必须在glViewport()函数内处理它的旧学校样式调用resizeGL()。我已经从qt4.8

的hellogl示例中复制了一个代码片段
void GLWidget::resizeGL(int width, int height)
{
    int side = qMin(width, height);
    glViewport((width - side) / 2, (height - side) / 2, side, side);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
#ifdef QT_OPENGL_ES_1
    glOrthof(-0.5, +0.5, -0.5, +0.5, 4.0, 15.0);
#else
    glOrtho(-0.5, +0.5, -0.5, +0.5, 4.0, 15.0);
#endif
    glMatrixMode(GL_MODELVIEW);
}

以下是hellogl的qt4.8版本的链接:http://doc.qt.io/qt-4.8/qt-opengl-hellogl-example.html

注意如何调用glViewport()来调整resizeGL()函数内的帧缓冲区的大小。即使在达到此功能之前,这也是由较新的QOpenGLWidget自动完成的。如果你选择坚持使用QGLWidget,你需要自己处理。

您可能还需要弄清楚其他微妙的差异。