我们有一个基于 QWidget 的应用程序,之前使用 QWindow 进行 OpenGL 渲染。为了使该窗口适合我们的应用程序,我们必须使用
QWidget QWidget::createWindowContainer(QWindow);
以前我们只使用 Qt OpenGL 库的外部进行渲染。
我们希望从使用 QWindow 切换到某种 QWidget,以与触摸手势兼容,并且通常与我们应用程序的其余部分具有更好的整体兼容性。最新推荐的 OpenGL 兼容 QWidget 似乎是 QOpenGLWidget,因此我们正在尝试使用它。
glContext
是我们自己管理的OpenGLContext。
现在的问题是 QOpenGLWidget 不是 QSurface,所以我无法调用
glContext->makeCurrent(this);
使上下文在我的自定义 QOpenGLWidget 上成为当前上下文,就像我们之前使用自定义 QWindow 和我们自己的 OpenGLContext 一样。
如果我尝试使用QOpenGLWidget::makeCurrent();
然后它使用了错误的上下文,并尝试使用一些神奇的 QT 处理上下文或我不理解的东西来做一些事情。
结果是,在创建 OpenGLContext 之后,当我们尝试调用
glFunctions = glContext->versionFunctions<QOpenGLFunctions_3_3_Core>();
if(!glFunctions->initializeOpenGLFunctions())
printf("Could not initialize OpenGL functions.");
它总是无法初始化 OpenGL 函数。
我一直在阅读我能找到的有关该主题的所有其他资源,并遇到了这个类似的较旧的 Stack Overflow 问题:具有共享 OpenGL 上下文的 QOpenGLWidget? https://stackoverflow.com/questions/33635001/qopenglwidget-with-shared-opengl-context
该问题的答案没有解决我的问题,因为我们使用的是 QApplication,而不是 QGuiApplication,因为这是一个基于 QWidget 的应用程序。QGuiApplicationPrivate::init()
从未被调用过并且QOpenGLContext::globalShareContext()
由于未初始化,因此返回空指针。
不幸的是我等不及了QOpenGLWidget::initializeGL()
被调用来初始化QT管理的OpenGLContext
因为我们已经在各种类上拥有大量 OpenGL 资源attempt在此之前进行初始化。
还有其他人遇到过同样的问题吗?
有什么建议么?