我正在使用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
,其余代码是相同的。同样的事情发生在我的应用中。
我试图找到解决方案,但我做不到。有人可能会告诉我为什么会发生这种情况以及如何解决它?
谢谢!
答案 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
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,你需要自己处理。
您可能还需要弄清楚其他微妙的差异。