使用自定义QPainter渲染QWidget

时间:2017-08-27 10:19:43

标签: c++ qt qt5 qwidget qpainter

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

要解决这个问题,我需要使用自定义QPainter来渲染小部件 在Qt4中,我可以通过使用属性WA_PaintOutsidePaintEvent并以另一种方法呈现窗口小部件来完成此操作。
但是,在Qt5中,这个属性消失了。

我尝试了什么:

  • 创建一个QWidget并覆盖paintEvent方法。
    • 没有真正工作(没有画任何东西),但也许这只是一个小错误。据我所知,此事件也不会阻止小部件进行自己的渲染,这是我想要阻止的。
  • 创建QGraphicsView和QGraphicsScene并将小部件添加到QGraphicsScene
    • 绘制小部件和透明度的工作原理。但是,事件(鼠标和键盘)不起作用。

1 个答案:

答案 0 :(得分:0)

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

我正在使用自定义顶级窗口小部件而无需其他功能,以便更轻松地处理鼠标和键盘 这个小部件没有父节点,并且使用QImage将其子节点渲染到内存中并叠加为图像。透明的方式就是这样。这里重要的是WA_NoSystemBackground属性 为了使事件有效,我在应用程序上安装了一个事件过滤器,并将事件传递给我的自定义小部件中的小部件。 我将免除你的详细信息,我打算在今年晚些时候将代码公开,并且我会在完成后添加一个链接。

然而,传递事件时有两个重要注意事项:
首先,为了防止无限的递归循环,因为你的过滤器也会捕获你发送的事件,我已经检查了接收对象是否是一个小部件,如果是,我只是检查这个小部件的topLevelWidget是否是我的一个实例自定义窗口小部件类,如果是,则忽略该事件 其次,简单地传递鼠标事件并不会使鼠标过度工作。有单独的悬停事件,你必须自己照顾。