【问题标题】:Use custom QPainter to render QWidget使用自定义 QPainter 渲染 QWidget
【发布时间】:2018-02-04 19:59:39
【问题描述】:

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

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

我的尝试:

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

【问题讨论】:

  • 请出示您的代码
  • 我真的不明白这有什么用。我的代码目前只是大量的实验。如果有帮助,我可以用更多代码充实示例,但考虑到我目前真的不知道自己在做什么,我有点怀疑这会有所帮助。归结为,我需要能够以某种方式将子小部件绘制到 QImage 中,并且它们仍然需要能够获取鼠标和键盘事件。
  • 然后我试着先学习和理解基础知识,然后再用我刚刚经历的知识。我不太了解您的问题,例如这意味着“问题是父小部件呈现 Qt 不知道的内容”。它显示了您想要了解的内容的图像,如果您要将小部件放在另一个小部件中使用布局,如果要更改颜色,则必须更改小部件的形式,您必须覆盖方法paintEvent .
  • 您能解释一下这对您意味着什么吗:将子小部件添加到小部件
  • 嗯,我有一个 Qt 应用程序,它包含一个小部件层次结构,就像任何 qt 应用程序一样。但是,这些小部件之一使用 3D 库呈现 3D 图像。由于 Qt 不知道像素数据,因此只需通过执行 QWidget *widget = new QWidget(the_3d_render_widget) 添加小部件确实可以将小部件添加到树中,但如果您现在使用 widget->setAttribute(Qt::WA_TranslucentBackground) 将背景设置为透明,则小部件将显示 Qt 应用程序下方的内容,而不是 3d 小部件的内容。

标签: c++ qt qt5 qwidget qpainter


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-09-23
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2013-07-27
    相关资源
    最近更新 更多