3

在我为 Linux 编写的应用程序中,我有一个由本机窗口(视频,通过 libmpv 渲染)支持的 QWidget,我想在其上覆盖另一个(透明)QWidget,该 QWidget 将用于在视频上绘图。

我尝试将它们都放入带有 QStackedLayout 的包含 QWidget(使用 StackAll 模式),但这会导致本机窗口内容更新不会反映在应用程序中,即使我在包含小部件上设置 Qt::WA_NativeWindow 以便容器它的所有子窗口(叠加层和视频小部件)都创建为本机窗口。

如果覆盖小部件不存在,则本机窗口确实会正确更新,因此这方面没有问题。覆盖小部件本身也没有问题,因为它只显示部分覆盖视频小部件区域,如预期的那样。

在过去,我使用 Gtk+ 编写了类似的东西,我通过使用 gdk_window_set_composited 解决了这个问题,这会导致视频小部件在屏幕外渲染,并且每当子更新时通知父小部件,以便它可以自己处理绘制子内容。但是,我在 Qt 中找不到任何对等的东西,所以我不知道如何实现这一点。

使用 QOpenGLWidget 不是一个选项,因为如果在播放期间切换当前工作空间,libmpv 会出现视频渲染速度变慢的问题。

4

0 回答 0