4

我们有一个基于 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 资源,这些资源试图在此之前进行初始化。

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

有什么建议么?

4

1 回答 1

0

我在这里做一些猜测工作。

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

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

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

然后尝试调用

QOpenGLWidget::makeCurrent();

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

configure -opengl desktop

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

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

于 2017-11-01T17:41:00.277 回答