QOpenGLWidget与QApplication?

时间:2017-11-01 15:44:26

标签: c++ qt opengl qapplication qopenglfunctions

我们有一个基于QWidget的应用程序,以前使用QWindow进行OpenGL渲染。要在我们的应用程序中使用该窗口,我们必须使用

QWidget QWidget::createWindowContainer(QWindow);

以前我们只使用外部的Qt OpenGL库进行渲染。

我们希望从使用QWindow切换到某种QWidget以与触摸手势兼容,并且通常与我们的其他应用程序的整体兼容性更好。最新推荐的OpenGL兼容QWidget似乎是QOpenGLWidget,所以我们试图使用它。

glContext是我们自己管理的OpenGLContext。

现在的问题是QOpenGLWidget不是QSurface,所以我无法调用

glContext->makeCurrent(this);

使用我们的自定义QWindow和我们自己的OpenGLContext,使我的自定义QOpenGLWidget上的上下文更新。

如果我尝试使用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资源这一点。

还有其他人遇到同样的问题吗?

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我在这里做一些猜测。

可能你的OpenGL默认为ANGLE。 您以前的应用程序OpenGL调用是特定于平台的OpenGL API。

尝试将以下属性设置为QApplication对象。

appObject->setAttribute(Qt::AA_UseDesktopOpenGL, true);

然后尝试调用

QOpenGLWidget::makeCurrent();

如果仍然无法正常工作,请为桌面OpenGL配置QT库。

configure -opengl desktop

以下链接为您提供了有关OpenGL的Qt方法的一些信息。 http://doc.qt.io/qt-5/windows-requirements.html

发表评论,如果这对您没有帮助,将删除答案。