QOpenGLWidget与QApplication一起使用?

4
我们有一个基于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,而不是基于QWidget的QGuiApplication。 QGuiApplicationPrivate::init()从未被调用,而QOpenGLContext::globalShareContext()返回一个空指针,因为它没有被初始化。

不幸的是,我不能等待QOpenGLWidget::initializeGL()被调用来初始化QT管理的OpenGLContext,因为我们已经在各种类上有大量的OpenGL资源尝试在此之前进行初始化。

是否有其他人遇到过同样的问题?

有什么建议吗?


我现在看到QApplication实际上是从QGuiApplication继承而来的,所以也许调用了QGuiApplicaitonPrivate :: init(),但globalShareContext似乎没有初始化,因为它返回null。 - ComradeJoecool
1个回答

0

我在这里猜测一下。

可能你的OpenGL正在使用ANGLE作为默认设置。 而你之前应用的OpenGL调用是特定于平台的OpenGL API。

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

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

然后尝试调用

QOpenGLWidget::makeCurrent();

如果问题仍然存在,请为您的QT库配置桌面OpenGL。
configure -opengl desktop

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

如果这不是对您有所帮助,请在评论中说明,我会删除这个答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接