2017-08-27 66 views
0

我试图将子窗口小部件添加到Qt5中的窗口小部件。 问题是,父窗口小部件呈现的内容不为Qt所知,因此透明度无法正常工作。使用自定义QPainter呈现QWidget

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

我已经试过什么:

  • 创建一个QWidget并重写的paintEvent方法。
    • 没有真正的工作(没有画任何东西),但也许这只是一个小小的错误。据我了解,这个事件也不会让小部件自己做渲染,这是我想要阻止的。
  • 创建的QGraphicsView和QGraphicsScene和小工具加入到QGraphicsScene
    • 绘制控件和透明度的工作。事件(鼠标&键盘),但是,不起作用。
+0

请显示您的代码 – eyllanesc

+0

我真的不知道这是怎么用的。我的代码目前只是很多实验。 如果有帮助,我可以用更多的代码充实这些例子,但考虑到我目前不知道自己在做什么,我怀疑这会有所帮助。 它归结为我需要能够以某种方式将子窗口小部件绘制到QImage中,并且他们仍然需要能够获取鼠标和键盘事件。 –

+0

然后我试着先学习和理解基础知识,然后用我刚刚经历的知识。我不太了解你的问题,例如,这意味着“问题在于父部件渲染的内容不为Qt所知”。它显示了你想要理解你的图像,如果你打算把这个小部件放在另一个小部件使用的布局中,改变如果你想改变颜色,小部件的形式,你必须重写方法paintEvent 。 – eyllanesc

回答

0

我最终什么事做和工作正常:

我使用的是定制的顶级窗口部件,没有额外的功能,使鼠标和键盘操作更轻松。
此小部件没有父项,并且使用QImage将其与子项呈现在内存中并叠加为图像。这样透明效果。这里重要的是WA_NoSystemBackground属性。
为了使事件起作用,我在应用程序上安装了一个事件过滤器,并将事件传递给我的自定义小部件中的小部件。 我会告诉你细节,我计划在今年晚些时候将代码公开,我会在完成后添加一个链接。

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