将 QT5 与 glLoadGen 一起使用

Posted

技术标签:

【中文标题】将 QT5 与 glLoadGen 一起使用【英文标题】:Using QT5 with glLoadGen 【发布时间】:2015-12-24 15:17:21 【问题描述】:

我正在使用 C++ 在 Windows 8.1 上使用 Qt5.4 编写一个 3D 应用程序的接口。应用程序正在使用 glLoadGen 加载 OpenGL 函数。

没有问题,GlWidget 和 glLoadGen 都希望在包含 gl.h 之前被包含在内,而且在某些时候都包含 gl.h。所以看起来,编译一个同时使用两者的文件是不可能的。

使用一些包装器,我也许可以绕过这个问题,但我宁愿不这样做。这个问题有什么干净的解决方案吗?

【问题讨论】:

仅供参考:glLoadGen 生成的标头不包括 gl.h。他们替换它。但它们确实 #define 与 gl.h 定义的定义相同,因此您不能同时包含两者。 【参考方案1】:

干净的解决方案是将您的顾虑分开。拥有一个与 Qt 交互的源文件,它使用 Qt 的东西。然后有另一个与 OpenGL 交互的源文件,使用 glLoadGen 的东西。

如果您有一个在概念上需要两者的函数,请让它在需要与 GL 对话时调用 OpenGL 交互代码中的函数。因此,如果您想在调整窗口大小时更改视口,您可以让 Qt 代码检测调整大小,然后调用一个转到 OpenGL 交互代码的函数来实际调用glViewport

这样,如果你需要从 Qt 切换,你只需要替换与 Qt 交互的代码。


话虽如此,glLoadGen 实际上并不是一个 OpenGL 加载库。它是用于 OpenGL 加载库的生成器。这是一个extensible platform。因此,如果将渲染代码粘贴到 UI 代码中对您来说真的很重要(一般来说,这是一种糟糕的形式),您可以编写一个实际上与 Qt 兼容的生成器样式。

当然,编写 glLoadGen 样式并非易事。您必须了解一些 Lua 脚本,并且必须阅读 how the generation system actually works。

【讨论】:

我认为这在另一个更大的项目中可能是干净的,抽象是有意义的。但就我而言,我只是创建另一个类/文件并将所有内容从 1 到 1 转发。这并不是说我会更改 GUI 类或任何东西,这实际上只会引入一堆样板代码,这使得我的程序既不可读也不灵活。这样做,只是因为“否则它不会编译”对我来说听起来不是一个干净的解决方案。 @JonathanK:如果您觉得将图形代码放入 UI 代码中是“干净的”,我无法说服您放弃它。但这不会改变 OpenGL 加载器几乎总是互斥的事实。 Qt 是一个 OpenGL 加载器,这要归功于它的 qglfunctions.h 标头伪装成 OpenGL ES 2(即使它不是)。所以他们发生冲突。它不仅仅是 glLoadGen;只是谷歌周围的 Qt 和 GLEW。您可以围绕问题编写代码或坚持使用 qglfunctions。

以上是关于将 QT5 与 glLoadGen 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

将 pyqtdeploy 与 Qt5 的自制安装一起使用

将 pdf.js 与 Qt5.8 一起使用

如何将 Qt 与 Rust 一起使用?

OpenGL 不使用 GLFW 和 GLLoadGen 在 Mavericks 上绘图

在同一进程中将 matplotlib 与 Qt5 后端一起使用并运行现有 QApplication

将 QCharts 与 Visual Studio 2015 一起使用时未解析的外部符号