我正在使用 DirectX 渲染到我的 QT 窗口,在我开始添加控件之前效果很好。然后,当 directx 覆盖它们时,它们会闪烁。 winforms 中的解决方案是在表单的 OnPaintBackground 中进行渲染,但我还没有在 QT 中找到等效项。有没有类似的东西或者可以用更好的方式完成?
我正在考虑渲染到纹理,然后以某种方式将其转换为像素图,然后我在 paintEvent() 中绘制它。
能够将按钮、面板和其他控件放置在正在呈现的内容之上(实时)对我来说很重要。
编辑。
Sergio Monteleone 的回答几乎有效,控件上的闪烁消失了。我在代码中更改了控件的父级并将其设置为主窗口而不是 QFrame。但是现在如果我在控件之间快速移动鼠标,我会在控件之间得到一个奇怪的灰色框。
在 PushButton 后面和 GroupBox 上面的灰色矩形只在几分之一秒内可见。知道这是为什么吗?
编辑 2.
我改变了问题的主题来描述实际问题而不是一个解决方案。
最佳答案
我假设您正在使用 QWidget 的 native hWnd 使用 DirectX 进行绘图。如果是这种情况,其他 Qt 控件会闪烁,因为当小部件重新绘制自身时,它也会导致完整的背景更新。然后,您使用 DirectX 在该表面上绘制,丢弃 Qt 控件到目前为止绘制的任何内容。
那么为什么它们会闪烁而不是完全消失呢?
QWidget 在内部使用双缓冲(查看文档 here )。 所以这实际上取决于 Qt 后台缓冲区何时失效。
不过,您可以使用一个简单的技巧:将 QFrame 添加到窗口,将 Qt 控件放在它上面,然后使用框架的 hWnd 作为 DirectX 目标。此外,您可能需要将该 QFrame 的 autoFillBackground 属性设置为 false。这应该允许您渲染到背景。
关于c++ - QT窗口中DirectX11渲染不丢失其他widgets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49999518/