c++ - QT窗口中DirectX11渲染不丢失其他widgets

标签 c++ qt qt5 directx-11

我正在使用 DirectX 渲染到我的 QT 窗口,在我开始添加控件之前效果很好。然后,当 directx 覆盖它们时,它们会闪烁。 winforms 中的解决方案是在表单的 OnPaintBackground 中进行渲染,但我还没有在 QT 中找到等效项。有没有类似的东西或者可以用更好的方式完成?

我正在考虑渲染到纹理,然后以某种方式将其转换为像素图,然后我在 paintEvent() 中绘制它。

能够将按钮、面板和其他控件放置在正在呈现的内容之上(实时)对我来说很重要。

编辑。

Sergio Monteleone 的回答几乎有效,控件上的闪烁消失了。我在代码中更改了控件的父级并将其设置为主窗口而不是 QFrame。但是现在如果我在控件之间快速移动鼠标,我会在控件之间得到一个奇怪的灰色框。 enter image description here

在 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/

相关文章:

c++ - 几个使用相同原型(prototype)的共享对象导致错误 : file already exists in database

C++/QT : Using constant pointer to private member as read-only data-sharing

c++ - 不允许最大化/显示 QML 中的应用程序

c++ - 贪婪与动态规划

c++ - 绑定(bind)到成员函数后测试 std::function 有效性

c++ - Visual Studio 15 - 重命名错误 : No References were found in the selected scope

c++ - 在 Qt 的 emit() 中传递指向自身的指针

c++ - C++ 应用程序的框架

Qt5 - 将简单的 Qt Quick 应用程序移植到 Qt5。需要帮助

c++ - Qt 将不完整的 JPEG 数据加载到 QPixMap 如何验证?