首页 > 解决方案 > 在绘画期间禁用 QWidget 的遮罩或让鼠标事件在没有遮罩的情况下通过

问题描述

我有一个用于覆盖其他小部件的小部件。它的目标是阻止窗口的所有小部件上的鼠标事件,但计数的小部件(未覆盖的小部件)。覆盖小部件在除未覆盖的小部件之外的各处绘制半透明图像。

我通过使用和由小部件的矩形(如)QWidget::setMask组成的s 成功地做到了这一点。QRegionALL.rect - uncovered_widget_1.rect - unconvered_widget_2.rect - ...

// mask_path is a member of type QPainterPath
// cover_widget is a member of type QWidget*
if (cover_widget->mask().isEmpty()) { // first time
  cover_widget->setMask(cover_widget->parentWidget()->rect());
  mask_path = {};
}

QPainterPath path;
path.addRect(uncovered_widget_rect);
mask_path.addPath(path);
cover_widget->setMask(cover_widget->mask().subtracted(path.toFillPolygon().toPolygon()));

在此处输入图像描述

现在,规格发生了一些变化,现在孔应该有圆角。在第一次尝试时,我更改了addRectwith但掩码是二进制的,并且在没有抗锯齿的情况下addRoundedRect,角落并不总是呈现圆形:

在此处输入图像描述

我可以通过禁用蒙版并在绘制事件处理程序中使用剪切路径来获得我想要的视觉结果,但是鼠标事件不会通过小部件。

QPainterPath path;
path.addRect(geometry());
painter.setClipPath(path.subtracted(mask_path));

在此处输入图像描述

我没有成功尝试忽略覆盖小部件中的鼠标事件。AFAIK 一旦一个事件被忽略,它就会上升到父母身上,但不会再回到另一个孩子身上(如果我错了,请纠正我)。

我见过RenderFlag::IgnoreMask但唯一使用它的地方是通过自定义调用QWidget::render,而不是在标准绘制流程期间。

有什么办法可以得到这样的效果:平滑裁剪多边形+让鼠标事件只在某些区域通过?

标签: c++qtmaskqwidget

解决方案


推荐阅读