Qt4: halbtransparente Widgets

Alles rund um die Programmierung mit Qt
geisterfahrer
Beiträge: 10
Registriert: 11. August 2004 11:36
Wohnort: Achim bei Bremen

Qt4: halbtransparente Widgets

Beitrag 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?
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

xcompmgr
geisterfahrer
Beiträge: 10
Registriert: 11. August 2004 11:36
Wohnort: Achim bei Bremen

Beitrag von geisterfahrer »

Ich wollte kein durchsichtiges Fenster, sondern nur einzelne Widgets.
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag 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.
geisterfahrer
Beiträge: 10
Registriert: 11. August 2004 11:36
Wohnort: Achim bei Bremen

Beitrag von geisterfahrer »

Ich benutze SIM, aber kann da nirgendwo transparente Widgets entdecken.
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag 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.
geisterfahrer
Beiträge: 10
Registriert: 11. August 2004 11:36
Wohnort: Achim bei Bremen

Beitrag 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.
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Ja, also brauchst du Alpha Blending. Vielleicht kommt lepsai später noch vorbei, der hat immer Ahnung von so Zeichenoperationen.
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag 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....
geisterfahrer
Beiträge: 10
Registriert: 11. August 2004 11:36
Wohnort: Achim bei Bremen

Beitrag 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.
Dateianhänge
qt4.png
qt4.png (5.98 KiB) 10208 mal betrachtet
qt42.png
qt42.png (3.74 KiB) 10208 mal betrachtet
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

setWindowOpacity() schon probiert? die sollte unter Qt 4 gehen...
geisterfahrer
Beiträge: 10
Registriert: 11. August 2004 11:36
Wohnort: Achim bei Bremen

Beitrag 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.
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag 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...
geisterfahrer
Beiträge: 10
Registriert: 11. August 2004 11:36
Wohnort: Achim bei Bremen

Beitrag 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.
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

screenshot, please
Antworten