2016-04-20 20 views
0

Ich versuche, ein Rechteck mit QPainter zu zeichnen. Das läuft gut, aber mir ist aufgefallen, dass, wenn ich einen Pinsel und einen Pinsel mit der gleichen Farbe auf den Maler setze, der Alpha-Faktor des Stiftes und der Pinsel irgendwie hinzugefügt werden. Dies führt dazu, dass die vom Stift gezeichnete Linie weniger transparent erscheint. Gibt es trotzdem, um diese Zugabe der Farben zu verhindern? Ich würde erwarten, dass, wenn der Stift und der Pinsel die gleiche Farbe haben, die von dem Stift gezeichnete Linie "unsichtbar" wäre. Unterhalb des Teils meines Codes, um das Rechteck und ein Bild der Ausgabe zu zeichnen.QPainter, verhindern das Hinzufügen von Alpha-Faktoren

QBrush newbrush = QBrush(painter->brush()); 
newbrush.setColor(QColor(0, 0, 255, 125)); 
newbrush.setStyle(Qt::SolidPattern); 
painter->setBrush(newbrush); 

QPen newpen = QPen(painter->pen()); 
newpen.setColor(QColor(0, 0, 255, 125)); 
newpen.setWidth(10); 
painter->setPen(newpen); 

painter->drawRect(QRect(QPoint(100, 50), QPoint(500, 500))); 

enter image description here

Antwort

1

Sie müssen composition mode den Maler ändern.

QPainter :: CompositionMode_SourceOver

Dies ist der Standardmodus. Das Alpha der Quelle wird verwendet, um den Pixel über dem Ziel zu mischen.

Also schauen Sie sich den Rest an und sehen Sie, wer es für Sie macht.

Wie in dem Kommentar unten erwähnt, müssen Sie die Füllung und den Umriss in einer Sequenz zeichnen, damit der Compositing-Modus einsetzt, da es scheinbar ignoriert wird, wenn Sie beide in einem einzigen Aufruf zeichnen . Das sequenzielle Zeichnen ist nicht notwendigerweise ein Leistungsaufwand, nur eine zusätzliche Zeile und einige Neuordnung im Code.

+0

Danke für die Hilfe, aber es scheint nicht zu funktionieren. Vielleicht funktioniert das nur, wenn mehrere Formen übereinander gezeichnet werden? – Frank

+1

Möglicherweise zeichnen Sie einfach die Füllung und den Strich in Folge. – dtech

3

Wenn Sie ein Objekt mit Alpha über ein anderes Objekt mit Alpha zeichnen, erhalten Sie einen "weniger transparenten Schnittbereich", der durch eine Summe von Alpha-Werten dieser beiden halbtransparenten Objekte dargestellt wird. Ich bin Brasilianer).

In Ihrem Fall wurde die Grenze mit Alpha 125 über das Rechteck auch mit Alpha 125 gezeichnet, was der Grenze den Eindruck von Alpha 250 (125 + 125) gibt.

Sie können die Umrandung mit painter->setPen(Qt::NoPen); entfernen oder getrennt und außerhalb des Rechtecks ​​zeichnen (painter->fillRect() für das Rechteck und painter->drawRect() für die Umrandung).

Each circle was drawn with alpha 25

Hoffe, es hilft.