2016-07-31 31 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中應用蒙版。 –

相關問題