QGLWidget渲染区域没有正确调整大小

QGLWidget rendering area not resizing proprely

本文关键字:调整 区域 QGLWidget      更新时间:2023-10-16

我正在使用Qt开发一个OpenGL应用程序,直到昨天我还在子类化QOpenGLWidget来创建我的自定义小部件,但是在将它添加到主应用程序之后,它是一个带有几个按钮和三个QGraphicsViewQMainWindow,它运行得很慢。我已经尝试使用QGLWidget和应用程序运行相同,没有OpenGL小部件。

我的问题是,我已经使子类QGLWidget的小部件没有适当地调整大小(或至少OpenGL渲染区域没有)。

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

使用QOpenGLWidget我得到:

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

使用QGLWidget我得到:

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

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

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

谢谢!

首先,按照@ddriver的建议,坚持使用最新的方法,远离被弃用的代码,这是一个好主意。

我已经使用QGLWidget写了很多代码,它没有问题。它做了我需要的一切,所以我现在坚持使用它。

这是你的方法的主要问题。您采用了qt 5.5中的hellogl示例,并简单地将父组件从QOpenGLWidget替换为QGLWidget。不幸的是,它们不能类似地处理resize事件。

QOpenglGLWidget确实根据resize事件给出的宽度和高度改变视口,正如他们的文档中提到的那样(不太清楚地使用双重否定)。链接:http://doc.qt.io/qt-5/qopenglwidget.html#resizeGL

检查resizeEvent()函数,该函数会调用resizeGL()

现在QGL小部件不会为您做这些。它所做的只是使opengl上下文是当前的,这意味着你必须以老派的方式在resizeGL()函数中调用glViewport()。我从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);
}

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

注意如何调用glViewport()来调整resizeGL()函数中的framebuffer大小。这是由较新的QOpenGLWidget自动完成的,甚至在达到这个函数之前。如果您选择坚持使用QGLWidget,则需要自己处理此问题。