当前位置: 首页 > 知识库问答 >
问题:

在opengl子窗口上渲染qt覆盖窗口

麻鸿熙
2023-03-14

我正在寻找一些关于渲染子窗口的信息,特别是关于OpenGL如何与GDI互操作的信息。我的问题是,我基本上有两个窗口,首先,主窗口是在qt中创建的,而在qt内部,子窗口是利用OpenGL渲染器托管的。

现在我想做的是在我的OpenGL窗口顶部托管一个覆盖,所以我用它来覆盖OpenGL窗口。我遇到的问题是,当我使用OpenGL渲染时,OpenGL生成的图形似乎模糊了图形区域,包括并有效地撤消了由qt合成的图形。

在图片下面的蓝色区域是qt叠加,在那张图片中我使用GDI (BeginPaint/EndPaint ),所以窗口看起来交互很好。也就是说,窗口顺序似乎是正确的,客户区是正确的。当我开始用OpenGL渲染的时候,蓝色区域被Opengl渲染的东西所取代。

我所做的基本上是创建覆盖图,我创建了第二个无框架,最上面的< code>QMainWindow,一旦平台HWND初始化,我就重新创建它。基本上,我把新窗口的父窗口改为我的OpenGL窗口的父窗口。

我认为这样做的结果是,每个窗口都被单独绘制,桌面合成管理器将进行最终合成,基本上避免了微软在其WPF框架中记录的臭名昭著的空域问题。

我想知道的是,是什么导致了这些问题?在这一点上,我不理解为什么一旦我使用OpenGL渲染,qt覆盖的像素会被模糊,即使windows层次结构应该说使它们合成。我能做什么来实现我想要的?

共有1个答案

安星汉
2023-03-14

从未支持在共享绘图上混合OpenGL和GDI绘图(也包括没有CS_OWNDC窗口类样式标志的兄弟/儿童窗口)。这与Qt无关,而只是OpenGL和GDI如何交互。

但更重要的问题是:为什么你一开始就不使用内置于Qt中的OpenGL支持呢?自从Qt-5(如果有的话)使用OpenGL来绘制所有内容(所有UI元素)以来。Qt-5使得混合Qt的东西和OpenGL绘图变得微不足道。

 类似资料:
  • 我正在尝试学习windows上的opengl编程,虽然我最初是从SDL开始的,但我已经决定放弃它,以便学习如何使用WGL自己启动OpenGL上下文。 我使用nanovg作为一个快速的图形绘制库,用SDL渲染一切都很好,但是,现在我已经移除了SDL,创建了我自己的窗口和OpenGL上下文,我发现窗口的标题栏与渲染区域重叠了。好像渲染区域的原点(0,0)在整个窗口的左上方,而不是标题栏的正下方,如果这

  • 我写了一个< code>OpenGL代码用于在屏幕上渲染图像。我使用< code>GLUT来创建一个窗口和回调,但是我想在< code>win32窗口中而不是在< code>GLUT中呈现图像,基本上我们有一个< code > CreateWindowEx() API来在< code>win32中创建窗口,并且我们有一个< code>HWND(句柄),以便我们可以将此句柄传递给< code>HDC

  • 我正在通过glfw3库学习OpenGL,我正在使用imgui制作一个有趣的应用程序。 我想做一个小引擎或CAD工具。 问题是我不能在imgui窗口中呈现我想要的。 我搜索了谷歌,找到了以下链接: https://gamedev.stackexchange.com/questions/150214/render-in-a-imgui-window https://gamedev.stackexcha

  • 我有一个常规的Win32窗口,我想使用OpenGL渲染该窗口的一部分,我发现了这个问题: 在常规窗口中使用打开GL (Win32) 但我真的不知道他们是如何在一个窗口内创建一个面板,并获得了它的DC。。 基本上,我想要一个使用win32绘制按钮、列表等的窗口,并在同一窗口的某个指定部分渲染opengl内容。 我试着使用glScissor和清除缓冲区,但这只是用黑色填充整个屏幕,而我指定的部分是透明

  • 问题内容: 我正在尝试创建系统覆盖图。但是我一直在“拒绝权限”。我正在使用SDK版本23。 我的清单文件: 我用来创建叠加层的代码: 问题答案: 首先,没有名为的权限。是的。 其次,如果您的年龄为23岁或更高,并且您正在运行Android 6.0+设备,则您的应用一开始将不会获得此权限。致电查看您是否具有权限,如果没有,则用于将用户引导到“设置”。

  • 我在QtDesigner中设计了三个窗口。主窗口使用按钮调用两个Childs窗口。如果我关闭主窗口,孩子的窗口也会关闭,我通过覆盖主窗口中的近事件来做到这一点。我需要在子窗口的近事件中实现一些东西,所以我覆盖了子类的近事件,但它什么也不做。请帮忙。 Qt Designer中主窗口的类 第一个子窗口的类 第二个子窗口类 调用其他三个的文件。