使用自定义 QPainter 渲染 QWidget

Use custom QPainter to render QWidget

我正在尝试将子窗口小部件添加到 Qt5 中的窗口小部件。 问题是父窗口小部件呈现 Qt 未知的内容,因此透明度无法正常工作。

要解决这个问题,我需要使用自定义 QPainter 来渲染小部件。
在 Qt4 中,我可以通过使用属性 WA_PaintOutsidePaintEvent 并以另一种方法呈现小部件来做到这一点。
然而,在Qt5中这个属性已经消失了。

我试过的:

我最后做了什么并且工作正常:

我使用的是自定义顶级小部件,没有附加功能来简化鼠标和键盘操作。
这个小部件没有父部件,并且使用 QImage 和它的子部件渲染到内存中并作为图像覆盖。这样透明度就起作用了。这里重要的是 WA_NoSystemBackground 属性。
为了使事件正常运行,我在应用程序上安装了一个事件过滤器,并将事件传递给自定义小部件中的小部件。 我不会告诉你细节,无论如何我计划在今年晚些时候制作代码 public,一旦完成我会添加一个 link。

但是,在传递事件时有两个重要的注意事项:
首先,为了防止无休止的递归循环,因为你的过滤器也会捕获你发送的事件,我检查了接收对象是否是一个小部件,如果是,我只是检查了这个小部件的 topLevelWidget 是否是我的一个实例自定义小部件 class,如果是,则忽略该事件。
其次,简单地传递鼠标事件并不能使鼠标悬停在上面。有单独的悬停事件,您必须自己处理。