有没有办法反转 QWidget::setMask() 函数或达到类似的效果?
Is there a way to invert the QWidget::setMask() function or achieve similar effect?
我正在尝试 "cut a hole" 在我的小部件背景中使其处于完全透明的特定位置并且您可以看到它背后的内容。问题是这个 "hole" 的大小和位置都不是固定的,所以它基本上可以在小部件上的任何地方,所以这就是为什么我不能使用蒙版图像。
有函数 setMask(QRegion) 但我需要的效果需要反转,所以基本上不是只绘制遮罩区域,而是应该绘制所有未被遮罩覆盖的区域。
有没有办法达到这样的效果?
试试这个:
const QRegion emptyRegion = <create your region>;
const QRegion rectRegion(QRect(QPoint(), widget->size()));
widget->setMask(rectRegion.subtracted(emptyRegion));
好的,在@ilotXXI 的帮助下,我找到了一种似乎比设置小部件掩码更好的方法:
if(mouseIsDown) // Only draw empty rect when mouse down
painter.setClipRegion(rectRegion.subtracted(emptyRegion));
painter.setBrush(QColor(0, 0, 0, 150)); //color for not-empty area
painter.drawRect(this->geometry()); // draw not-empty area
这似乎比设置蒙版工作得更快,而且我不再有延迟。 @ilotXXI 感谢您的帮助:)
我正在尝试 "cut a hole" 在我的小部件背景中使其处于完全透明的特定位置并且您可以看到它背后的内容。问题是这个 "hole" 的大小和位置都不是固定的,所以它基本上可以在小部件上的任何地方,所以这就是为什么我不能使用蒙版图像。
有函数 setMask(QRegion) 但我需要的效果需要反转,所以基本上不是只绘制遮罩区域,而是应该绘制所有未被遮罩覆盖的区域。
有没有办法达到这样的效果?
试试这个:
const QRegion emptyRegion = <create your region>;
const QRegion rectRegion(QRect(QPoint(), widget->size()));
widget->setMask(rectRegion.subtracted(emptyRegion));
好的,在@ilotXXI 的帮助下,我找到了一种似乎比设置小部件掩码更好的方法:
if(mouseIsDown) // Only draw empty rect when mouse down
painter.setClipRegion(rectRegion.subtracted(emptyRegion));
painter.setBrush(QColor(0, 0, 0, 150)); //color for not-empty area
painter.drawRect(this->geometry()); // draw not-empty area
这似乎比设置蒙版工作得更快,而且我不再有延迟。 @ilotXXI 感谢您的帮助:)