Seite 1 von 2

Qt4: halbtransparente Widgets

Verfasst: 6. Juli 2005 10:57
von geisterfahrer
Folgender Satz steht in der Dokumentation von Qt4 unter "Porting to Qt 4":
"Widget background painting has been greatly improved, supporting flickerfree updates and making it possible to have half transparent widgets."
Wie bekommt man das mit den halbtransparenten Widgets hin? Ich hab testweise versucht einem Widget QPalette mit einer durchsichtigen Farbe unterzujubeln, aber statt das Widget unter dem Widget zu sehen, mischt er meine Hintergrundfarbe mit dem Standardhintergrund. War der Satz aus der Dokumentation nur für QStyle zu gelten? Denn dort scheint es auf einem transparentn Hintergrund zu zeichnen kein Problem zu sein. Aber nur um einen transparenten Hintergrund zu haben meinem Widget eine eigene QStyle Klasse unterjubeln? Der Aufwand erscheint mir nicht ganz angemessen..
Kennt jemand eine Möglichkeit ein völlig durchsichtiges Widget zu bekommen auf möglichst einfache Art und Weise?

Verfasst: 6. Juli 2005 11:42
von FlorianBecker
xcompmgr

Verfasst: 6. Juli 2005 12:00
von geisterfahrer
Ich wollte kein durchsichtiges Fenster, sondern nur einzelne Widgets.

Verfasst: 6. Juli 2005 12:03
von FlorianBecker
Mh, heißt alpha blending oder so, aber ich weiss nicht, wie das mit Qt geht, und schon gar nicht wie das mit Qt4 geht. SIM ist GPL'ed, die benutzen Transparente WIDGETS.

Verfasst: 6. Juli 2005 15:53
von geisterfahrer
Ich benutze SIM, aber kann da nirgendwo transparente Widgets entdecken.

Verfasst: 6. Juli 2005 16:00
von FlorianBecker
Verstehe, also die Message Windows sollten transparent einzustellen sein. Zumindest war das in der 0.9.x so. Ansonsten gibts glaube ich nur noch für das MainWin transparentz, aber da könnte ich mich auch irren.

Steht denn nix davon in den Optionen? Mehr kann ich dazu auswendig leider nicht sagen, denn ich benutze Sim nicht mehr.

Verfasst: 6. Juli 2005 16:13
von geisterfahrer
Ahja, hab die Option Transparenz gefunden, aber die bietet eine ganz andere Funktion, als ich sie haben wollte: Sie zeigt den Desktophintergrund an. Ich will nur das darunter liegende Widget sehen (also meins und nicht irgendwelche Fremdsachen).
Achja, ergänzend wollte ich erwähnen, dass nicht das ganze Widget, also auch das was ich zeichne, nicht transparent sein soll, sondern nur der Hintergrund des Widgets soll vollkommen durchsichtig sein.

Verfasst: 6. Juli 2005 16:14
von FlorianBecker
Ja, also brauchst du Alpha Blending. Vielleicht kommt lepsai später noch vorbei, der hat immer Ahnung von so Zeichenoperationen.

Verfasst: 7. Juli 2005 21:48
von lepsai
Also, ich hab nicht ganz verstanden, was nun transparent sein soll. Kannste vielliecht präzise beschreiben, was du zeichnest, warum und wo.
Am besten mit Code und Screenshots....

Verfasst: 8. Juli 2005 10:43
von geisterfahrer
Also ich möchte ein Widget so haben, das es keine leere graue Fläche als Hintergrund hat, sondern einen durchsichtigen Hintergrund hat, also das Widget was dahinter liegt zu sehen ist. Aber das was ich dann ins Widget reinzeichne soll natürlich sichtbar sein und soll die Möglichkeit haben halbtransparent zu sein.
Auf dem Screenshot soll der rote Rahmen das Widget markieren. Wie man sieht, ist es dort wo nichts gezeichnet wurde vollkommen durchsichtig und man sieht den Button unverfälscht. Der Kreis ist in dieses Widget reingezeichnet worden und hat von der Möglichkeit von Qt4 einen Alpha Kanal anzugeben gebrauch gemacht.

Nochmal zu meinem Problem: Wenn ich dem Widget sage, er soll als Hintergrundfarbe eine transparente Farbe als Hintergrund haben, zeichnet er diese auch habltransparent, aber von irgendwo her kommt doch noch immer die graue Hintergrundfarbe mit der er mischt. Zu sehen auf dem zweiten Screenshot. Hier der Code aus dem Konstruktors:
QPalette palette( QApplication::palette() );
palette.setColor( backgroundRole(), QColor( 255, 0, 0, 10 ) );
setPalette(palette);
Wie man sieht, malt er das knallige Rot zwar sehr durchsichtig, aber der Button im Hintergrund ist dennoch nicht zu sehen.

Ermöglichen will ich sowas wie auf dem ersten Screenshot zu sehen: http://doc.trolltech.com/4.0/widgets-styles.html
Gut zu sehen an der ComboBox oder an dem Fortschrittsbalken. Nur sowas möchte ich eben auch auf QWidget Ebenene können und nicht meine eigene QStyle Klasse bauen.

Verfasst: 8. Juli 2005 11:54
von lepsai
setWindowOpacity() schon probiert? die sollte unter Qt 4 gehen...

Verfasst: 8. Juli 2005 19:28
von geisterfahrer
Nein, damit kann man nur das gesamte Fenster transparent machen. Zudem laut Dokumentation:
This feature is only present on Mac OS X and Windows 2000 and up.

Verfasst: 8. Juli 2005 23:49
von lepsai
na gut, dann muss man dann wohl per Hand machen.

In deinem Fall haben wir zwei Regionen im Fenster, einmal voll transparent und einmal irgendwie transparent. Als erstes beschreiben wir den transparenten Bereich:

Code: Alles auswählen

// Im Konstruktor:
setAutoMask(TRUE);

// in der updateMask()
QBitmap bm( size() );
bm.fill( color0 );                  //transparent

QPainter paint;
paint.begin( &bm, this );
	
paint.setBrush( color1);           // nicht transparent
paint.setPen( color1);
... zeichne, was du brauchst
paint.end();
setMask( bm );
} 
unter Qt 3 hätte man damit ein voll transparentes Widget erzeugt.
ich denke aber, dass wenn du mit QT4 Painter halbtransparente Farben verwendest, könnte es klappen... Wenn nicht, dann kannste ein Pixmap mit deinen halbtransparenten Sachen erzeugen und dieses anschließend
mit dem Hauptpainter zeichnen...

Verfasst: 9. Juli 2005 11:10
von geisterfahrer
Hmm, jetzt habe ich ein kreisrundes Widget, aber mit halbtransparent funktioniert da nichts. In dem Teil der nicht transparent ist, hab ich wieder mein gräßlichen blassen roten Hintergrund und von dem Button ist immer noch nichts zu sehen.

Verfasst: 9. Juli 2005 11:14
von lepsai
screenshot, please