将 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 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
OpenGL 不使用 GLFW 和 GLLoadGen 在 Mavericks 上绘图