2016-07-31 276 views
0

我试图在我的小部件背景中“剪下一个洞”,以便它在完全透明的特定位置,并且您可以看到它背后的内容。问题是这个“洞”的大小和位置都是固定的,所以它基本上可以在小部件的任何地方,这就是为什么我不能使用蒙版图像。有没有办法来颠倒QWidget :: setMask()函数或实现类似的效果?

有函数setMask(QRegion),但我需要的效果需要倒置,所以基本上,而不是只绘制蒙版区域,它应该绘制所有不被蒙版覆盖的区域。

有没有办法达到这样的效果?

回答

2

好,与@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感谢您的帮助:)

1

试试这个:

const QRegion emptyRegion = <create your region>; 
const QRegion rectRegion(QRect(QPoint(), widget->size())); 
widget->setMask(rectRegion.subtracted(emptyRegion)); 
+0

真棒,这个工程。虽然有点慢,但有点滞后。任何为什么要提高速度或缓存一些东西? –

+0

我不知道。它何时滞后?起初,你什么时候应用它? – ilotXXI

+0

空白区域是通过鼠标绘制的,因此当我绘制这个区域时它会滞后。 我把mouseDown的位置和mouseMove更新当前鼠标的位置,并根据我得到emptyRegion。在mouseMove函数中,我还调用Update()来再次绘制小部件,并在覆盖的paintEvent中应用蒙版。 –

相关问题