【问题标题】:QOpenGLWidget with QApplication?QOpenGLWidget 与 QApplication?
【发布时间】: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


【解决方案1】:

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

可能您的 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

放入 cmets,如果这对您没有帮助,将删除答案。

【讨论】:

  • 谢谢回复,有机会试试这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多