我试图在我的小部件背景中“剪下一个洞”,以便它在完全透明的特定位置,并且您可以看到它背后的内容。问题是这个“洞”的大小和位置都是固定的,所以它基本上可以在小部件的任何地方,这就是为什么我不能使用蒙版图像。有没有办法来颠倒QWidget :: setMask()函数或实现类似的效果?
有函数setMask(QRegion),但我需要的效果需要倒置,所以基本上,而不是只绘制蒙版区域,它应该绘制所有不被蒙版覆盖的区域。
有没有办法达到这样的效果?
我试图在我的小部件背景中“剪下一个洞”,以便它在完全透明的特定位置,并且您可以看到它背后的内容。问题是这个“洞”的大小和位置都是固定的,所以它基本上可以在小部件的任何地方,这就是为什么我不能使用蒙版图像。有没有办法来颠倒QWidget :: setMask()函数或实现类似的效果?
有函数setMask(QRegion),但我需要的效果需要倒置,所以基本上,而不是只绘制蒙版区域,它应该绘制所有不被蒙版覆盖的区域。
有没有办法达到这样的效果?
好,与@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感谢您的帮助:)
试试这个:
const QRegion emptyRegion = <create your region>;
const QRegion rectRegion(QRect(QPoint(), widget->size()));
widget->setMask(rectRegion.subtracted(emptyRegion));
真棒,这个工程。虽然有点慢,但有点滞后。任何为什么要提高速度或缓存一些东西? –
我不知道。它何时滞后?起初,你什么时候应用它? – ilotXXI
空白区域是通过鼠标绘制的,因此当我绘制这个区域时它会滞后。 我把mouseDown的位置和mouseMove更新当前鼠标的位置,并根据我得到emptyRegion。在mouseMove函数中,我还调用Update()来再次绘制小部件,并在覆盖的paintEvent中应用蒙版。 –