在 OpenGL 中渲染 QWidget

Posted

技术标签:

【中文标题】在 OpenGL 中渲染 QWidget【英文标题】:Render QWidget in OpenGL 【发布时间】:2013-05-10 13:31:39 【问题描述】:

我有一个 OpenGL 应用程序,我想给它添加一个 GUI。

我的问题是我想保持创建窗口和主循环的方式。事实上,我想保留我的应用程序,只是添加一些小部件来与场景交互......

我知道我们可以通过重载 QApplication 将 OpenGL 用作渲染器,但它会创建一个窗口并创建另一个我不想要的 OpenGL 上下文...我知道我可以使用 QGLWidget 将 OpenGL 场景渲染到其中,但是它也不符合我的要求……

我在很多论坛上搜索都没有找到解决方案。我想知道这是否可能,如果可以,实现的方法是什么?

如果无法做到,有没有办法做到?好像CEGUI可以做到,但我认为它似乎有点年轻不?

【问题讨论】:

【参考方案1】:

我的问题是我想保持创建窗口和主循环的方式。

要使用 Qt 小部件系统,您必须使用 QApplication 和它产生的事件系统。不能有两个事件循环在相同的资源(窗口、用户输入、信号接收和传递)之间进行竞争。

事实上,我想保留我的应用程序,只是添加一些小部件来与场景交互......

Then a beautiful Rolling Stones song applies to you: "You can't always get what you want…"

顺便说一句?您现在如何创建窗口?过剩?然后从 QGLWidget 派生并覆盖其 resizeGLpaintGLtimerEvent 并使用 0 延迟计时器将空闲时间加倍,mouse*Event 方法将为您提供与 GLUT 完全相同的行为。

您可能会发现 Qt 的框架和事件系统正是您所需要的。

【讨论】:

事实上,我正在创建一个中间件,我想提供一个符合我客户需求的 GUI,但我不知道我的客户在那里创建窗口的方式......我想知道如果可以通过在纹理中渲染 GUI 来做到... @PierreFourgeaud:GUI 的问题在于,它们必须集成到应用程序事件处理中才能工作。原则上,您可以使用 Qt 渲染到纹理。但是 Qt 的信号/槽系统渗透到整个应用程序中,需要控制事件循环才能工作。将 GUI 渲染到纹理是完全可能的,但您仍然遇到问题:如何将用户输入事件放入该 GUI? 实际上我们想模拟事件系统。当用户单击按钮时,只需触发与该按钮对应的事件。因为在使用我们中间件的应用程序中,用户不会使用鼠标,而是使用一些虚拟现实设备,如 Wand、Razer Hydra 等......并且他将与 GUI 进行 3D 交互。将设备的位置和方向与用户想要做的光线投射相结合。 @PierreFourgeaud:在这种情况下,您应该看看用于 VR 和游戏集成的 GUI 系统。我不能推荐一个具体的,但在短暂的谷歌搜索后,我发现了这个,看起来很有希望:code.google.com/p/begui 谢谢。我们也看到了这个和 cegui。但我们想知道他们是否足够强大,拥有正确的社区。这就是我们尝试使用 QT 甚至 GTK 的原因。但似乎我们在最后一个问题上遇到了同样的问题。感谢您的宝贵时间。【参考方案2】:

您尝试过hello-gl 示例吗?它在 OpenGL 渲染和其他基本操作(调整大小、循环、视图)方面有非常好的和干净的代码。如果您遇到 GLUT 问题,只需在 int main() 之后添加 glutInit(&argc,argv);

【讨论】:

以上是关于在 OpenGL 中渲染 QWidget的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenGL 中渲染透明块

OpenGL + QT:渲染到纹理并显示回来

为啥精灵不在 OpenGL 中渲染?

在 Haskell 中使用 OpenGL 渲染 PNG 图像

ios的opengl究竟能不能在非主线程渲染

opengl 渲染方式在屏 离屏 CPU