2016-07-31 9 views
0

Ich versuche, ein "Loch" in meinem Widgets Hintergrund, so dass es an einem bestimmten Ort völlig transparent ist und dass Sie können sehen, was dahinter ist. Das Problem ist, dass weder die Größe noch der Ort dieses "Lochs" fest sind, also kann es grundsätzlich irgendwo auf dem Widget sein, deshalb kann ich keine Maskenbilder verwenden.Gibt es eine Möglichkeit, die QWidget :: setMask() - Funktion zu invertieren oder einen ähnlichen Effekt zu erzielen?

Es gibt die Funktion setMask (QRegion), aber der Effekt, den ich benötige, müsste invertiert werden, also sollte man grundsätzlich nicht nur die maskierte Region zeichnen, sondern auch alles, was nicht von der Maske abgedeckt wird.

Gibt es eine Möglichkeit, einen solchen Effekt zu erzielen?

Antwort

2

Ok, mit @ilotXXI Hilfe Ich habe einen Weg gefunden, die dann die Einstellung der Widget-Maske, besser zu sein scheint:

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 

Das scheint viel zu arbeiten schneller als das Einstellen der Maske und ich habe keine Verzögerung mehr. @ilotXXI danke für die Hilfe :)

1

Versuchen Sie folgendes:

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

Ehrfürchtig, das funktioniert. Obwohl es langsam ist, ist es ein wenig nachlassend. Irgendwelche Gründe, um die Geschwindigkeit zu verbessern oder etwas zu cachen? –

+0

Ich weiß es nicht. Wann verzögert es? Wann, wann wenden Sie es an? – ilotXXI

+0

Die leere Region wird mit der Maus gezeichnet, so dass sie beim Zeichnen dieser Region zurückbleibt. Ich nehme die mouseDown Position und auf mouseMove aktualisiere die aktuelle Mausposition und basiere darauf, dass ich die emptyRegion bekomme. In der mouseMove-Funktion rufe ich auch Update() auf, um das Widget erneut zu zeichnen und im überschriebenen paintEvent übernehme ich die Maske. –

Verwandte Themen