我们有一个基于 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 问题: QOpenGLWidget with shared OpenGL context?
这个问题的答案并没有解决我的问题,因为我们使用的是 QApplication,而不是 QGuiApplication,因为这是一个基于 QWidget 的应用程序。
QGuiApplicationPrivate::init()
永远不会被调用并且QOpenGLContext::globalShareContext()
返回一个空指针,因为它没有被初始化。
不幸的是,我迫不及待QOpenGLWidget::initializeGL()
地等待被调用来初始化托管的 QT,OpenGLContext
因为我们已经在各种类上拥有大量 OpenGL 资源,这些资源试图在此之前进行初始化。
有没有其他人遇到过同样的问题?
有什么建议么?