【发布时间】:2018-04-13 23:49:35
【问题描述】:
我们有一个基于 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 资源,尝试在此之前进行初始化。 p>
还有其他人遇到过同样的问题吗?
有什么建议吗?
【问题讨论】:
-
我现在看到 QApplication 实际上继承自 QGuiApplication,所以可能调用了 QGuiApplicaitonPrivate::init(),但 globalShareContext 似乎没有被初始化,因为它返回 null
标签: c++ qt opengl qapplication qopenglfunctions