使用自定义 QPainter 渲染 QWidget
Use custom QPainter to render QWidget
我正在尝试将子窗口小部件添加到 Qt5 中的窗口小部件。
问题是父窗口小部件呈现 Qt 未知的内容,因此透明度无法正常工作。
要解决这个问题,我需要使用自定义 QPainter 来渲染小部件。
在 Qt4 中,我可以通过使用属性 WA_PaintOutsidePaintEvent 并以另一种方法呈现小部件来做到这一点。
然而,在Qt5中这个属性已经消失了。
我试过的:
- 创建一个QWidget 并覆盖paintEvent 方法。
- 没有真正起作用(没有画任何东西)但也许这只是一个小错误。据我所知,这个事件也不会阻止小部件进行自己的渲染,这是我想要阻止的。
- 创建一个 QGraphicsView 和一个 QGraphicsScene 并将小部件添加到 QGraphicsScene
- 绘制小部件和透明效果。但是,事件(鼠标和键盘)不起作用。
我最后做了什么并且工作正常:
我使用的是自定义顶级小部件,没有附加功能来简化鼠标和键盘操作。
这个小部件没有父部件,并且使用 QImage 和它的子部件渲染到内存中并作为图像覆盖。这样透明度就起作用了。这里重要的是 WA_NoSystemBackground 属性。
为了使事件正常运行,我在应用程序上安装了一个事件过滤器,并将事件传递给自定义小部件中的小部件。
我不会告诉你细节,无论如何我计划在今年晚些时候制作代码 public,一旦完成我会添加一个 link。
但是,在传递事件时有两个重要的注意事项:
首先,为了防止无休止的递归循环,因为你的过滤器也会捕获你发送的事件,我检查了接收对象是否是一个小部件,如果是,我只是检查了这个小部件的 topLevelWidget 是否是我的一个实例自定义小部件 class,如果是,则忽略该事件。
其次,简单地传递鼠标事件并不能使鼠标悬停在上面。有单独的悬停事件,您必须自己处理。
我正在尝试将子窗口小部件添加到 Qt5 中的窗口小部件。 问题是父窗口小部件呈现 Qt 未知的内容,因此透明度无法正常工作。
要解决这个问题,我需要使用自定义 QPainter 来渲染小部件。
在 Qt4 中,我可以通过使用属性 WA_PaintOutsidePaintEvent 并以另一种方法呈现小部件来做到这一点。
然而,在Qt5中这个属性已经消失了。
我试过的:
- 创建一个QWidget 并覆盖paintEvent 方法。
- 没有真正起作用(没有画任何东西)但也许这只是一个小错误。据我所知,这个事件也不会阻止小部件进行自己的渲染,这是我想要阻止的。
- 创建一个 QGraphicsView 和一个 QGraphicsScene 并将小部件添加到 QGraphicsScene
- 绘制小部件和透明效果。但是,事件(鼠标和键盘)不起作用。
我最后做了什么并且工作正常:
我使用的是自定义顶级小部件,没有附加功能来简化鼠标和键盘操作。
这个小部件没有父部件,并且使用 QImage 和它的子部件渲染到内存中并作为图像覆盖。这样透明度就起作用了。这里重要的是 WA_NoSystemBackground 属性。
为了使事件正常运行,我在应用程序上安装了一个事件过滤器,并将事件传递给自定义小部件中的小部件。
我不会告诉你细节,无论如何我计划在今年晚些时候制作代码 public,一旦完成我会添加一个 link。
但是,在传递事件时有两个重要的注意事项:
首先,为了防止无休止的递归循环,因为你的过滤器也会捕获你发送的事件,我检查了接收对象是否是一个小部件,如果是,我只是检查了这个小部件的 topLevelWidget 是否是我的一个实例自定义小部件 class,如果是,则忽略该事件。
其次,简单地传递鼠标事件并不能使鼠标悬停在上面。有单独的悬停事件,您必须自己处理。