Widgets: Transparents und Hintergrundbild

Code-Schnippsel, oder Tipps und Tricks, die einem beim Programmieren mit Qt helfen können.
Esleborn
Beiträge: 265
Registriert: 27. Januar 2005 01:23
Wohnort: Baden-Würtenberg
Kontaktdaten:

Widgets: Transparents und Hintergrundbild

Beitrag von Esleborn »

hi,
ich hatte das Problem, dass ich QWidgets mit transparenten Hintergrund oder einem Hintergrundbild ausstatten wollte... die Frage kam glaub ich auch mehrfach in diesem Forum auf...

wie auch immer hier der Code, vereinfacht auf das Nötigste, mit dem man mit dem Aufruf einer einfachen Funktion das nötige durchführt.

Code: Alles auswählen

# include <QWidget>
# include <QBrush>
# include <QPixmap>
# include <QColor>
# include <QPalette>

void SetBackgroundImage ( QWidget *fp_widget, const QPixmap *fp_image )
{
   QPalette newPalette = fp_widget->palette ( );
   newPalette.setBrush
   (
      QPalette::Base,
      QBrush ( *fp_image )
   );

   newPalette.setBrush
   (
      QPalette::Background,
      QBrush ( *fp_image )
   );

   fp_widget->setPalette ( newPalette );
}

QBrush BrushSetAlpha ( QBrush f_brush, const int f_alpha )
{
   QColor color = f_brush.color ( );
   color.setAlpha ( f_alpha );
   f_brush.setColor ( color );

   return f_brush;
}

void SetTransparency ( QWidget *fp_widget, bool f_transparent )
{
   int alpha ( 255 );

   if ( f_transparent )
      alpha = 0;

   QPalette newPalette = fp_widget->palette ( );

   newPalette.setBrush ( QPalette::Base, BrushSetAlpha ( newPalette.base ( ), alpha ) ); // sollte rausgeschmissen werden, wenn Textfelder sonst zu unleserlich sind.
   newPalette.setBrush ( QPalette::Background, BrushSetAlpha ( newPalette.background ( ), alpha ) );

   fp_widget->setPalette ( newPalette );
}
PS: Toolbars müssen auch QPalette::Base transparent um ihren Hintergrund vollständig transparent zu erhalten. Das ist für viele Widgets aber eher nicht gewünscht...

Ich werd meine Umsetzung in Form von Klassen für QWidgets, QMainWindow und QToolBar abgeleitete Klassen hier posten, sobald ich das letzte Problem mit den ToolBars gelöst habe. Diese Klassen werden dann einfache Funktionen haben, alle "Childwidgets"/sich selbst zwischen (hintergrund-)transparent und "Normal" switchen zu lassen, Hintergrundbilder einzubetten und Masken zu setzen (erstmal auf die Betriebssysteme die setMask effektiv unterstützen beschränkt).

Ich weiß, dass sind alles Kleinigkeiten, die man sich selbst schnell geschrieben hat, aber ich find es grad für Qt-Newbies wie mich recht geschickt, dass einfach durch den Aufruf einer kleinen Funktion, zu erledigen, ohne sich um Paletten kümmern zu müssen, man ist ja faul *grins...


Ich hoff mal das hilft irgendwem *grins

Elgrimm Esleborn
Glaube an eine Lösung, nur dann kannst du auch eine finden.
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Sehr gut. Idee mit den Paletten gefällt mir. Bravo!
AngelD
Beiträge: 2
Registriert: 1. Dezember 2005 11:04

Beitrag von AngelD »

Hi!

Ich habe probiert das in meinen Quellcode einzubinden, bin dabei allerdings auf ein mehr oder weniger kleines Problem gestoßen.

Ich habe ein ControlWidget. Auf diesem Widget wird ein BackgroundWidget erzeugt. Ebenso wird über das BackGroundWidget weiter Widgets mit Labels und Buttons erzeugt.
Der HinterGrund der am höchsten liegenden Widgets(Buttons, Labels), sollen durchsichtig gemacht werden. Das habe ich auch alles soweit hinbekommen, nur leider ist der Hintergrund schwarz, und nicht das Widget mit dem Hintergrundbild wie es eigentlich sein sollte.

Also einfach gesagt, ich brauche ein ControlWidget mit einem Hintergrundbild auf dem Labels und Pushbuttons (in eigenen Widgets geschrieben) dargestellt werden sollen. Hat da jemand eine Idee??

EDIT:
Es hat sich mittlerweile erledigt. Habe die SetBackGround Method gemacht, und mit dieser funzt das prima.... :)
Fazit: Danke für diesen Thread.... ;)
klogg
Beiträge: 129
Registriert: 5. September 2005 17:00
Wohnort: Hann. Münden

Beitrag von klogg »

Ist wirklich ein feiner Thread.
Hat denn mittlerweile jemand Ergebnisse produziert,
die er hier den anderen Mitgliedern zur Verfügung stellen möchte?
Ich fände das unheimlich nett. :-)

HENNING
Esleborn
Beiträge: 265
Registriert: 27. Januar 2005 01:23
Wohnort: Baden-Würtenberg
Kontaktdaten:

Beitrag von Esleborn »

ich hätte da mehrere Klassen geschrieben, bei denen dann durchsichtig machen bzw ein Hintergrundbild setzen funktioniert. Nur das wieder nicht "normal" machen funktioniert nicht...

jemand dran interessiert?

PS: Der Fehler mit dem Schwarz könnte hier gelöst werden... sicher bin ich aber nicht
Glaube an eine Lösung, nur dann kannst du auch eine finden.
shader76
Beiträge: 107
Registriert: 3. März 2006 14:29

Beitrag von shader76 »

mich würde es sehr interessieren wie man ein hintergrundbild in ein QDialog Fenster einbaut. :!: :!:
-shader76-
-Visual Studio.Net 2003 & QT4.1
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

shader76 hat geschrieben:in ein QDialog Fenster
Ein QDialog ist doch auch ein QWidget, also wo ist das Problem? :D

Goos
shader76
Beiträge: 107
Registriert: 3. März 2006 14:29

Beitrag von shader76 »

Das ist ja schon klar, aber ich weiss nicht wie ich wann das Bild übergebe.
habe mir die obigen Functions angeschaut und nicht richtig gecheckt wo da ein Bild übergeben wird.

Braucht man den 3 Functions dafür ?

Bin halt noch newbie was Qt anbelangt
-shader76-
-Visual Studio.Net 2003 & QT4.1
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

shader76 hat geschrieben:Das ist ja schon klar, aber ich weiss nicht wie ich wann das Bild übergebe.
habe mir die obigen Functions angeschaut und nicht richtig gecheckt wo da ein Bild übergeben wird.
Hast du dir die drei Funktionen wirklich angeschaut?
Die sind doch weitestgehend selbstredend.
Bzw. hast du ueberhaupt mal mit dem Beispiel hier etwas probiert?
Falls ja, wo hings, was bekamst fuer Fehler? :)

Goos
shader76
Beiträge: 107
Registriert: 3. März 2006 14:29

Beitrag von shader76 »

Natürlich habe ich sie mir angeschaut. Aber meine Frage ist :

- Braucht man einen Alpha Kanal um ein Hintergrundbild zu setzen oder eine Transparenz oder ist das nur für Masken gedacht ?

- Wo übergebe ich wem das Bild ?

- Wozu brauche ich eine Palette ?

Mein Ziel ist es eine Grafik als Hintergrundbild zu haben welche verschiedene Netzverbindungen darstellt, weiterhin möchte ich an bestimmten Stellen Labels einsetzen um die IP-Adressen,Netzmasken variabel zu halten.

Ich weiss auch dass ich wenn ich es verstanden habe sagen werde : AHHHH DAS IST JA TOTAL EINFACH UND SELBSTREDEND !

Nur bin ichhalt noch nicht soweit :oops:
-shader76-
-Visual Studio.Net 2003 & QT4.1
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

Fuer dich reicht die void SetBackgroundImage ( QWidget *fp_widget, const QPixmap *fp_image ) Funktion.

Das Bild wird natuerlich als QPixmap uebergeben.
Die Palette ist halt eine Palette aller Farben die dein Widget braucht.
(siehe auch Qt Hilfe unter QPalette)
Du setzt dein Bild also quasi als Hintergrundmuster in der Palette deines Widgets.
Die Alpha-Sachen sind fuer deinen Fall nicht weiter relevant.

Goos

PS: Du solltest mal mit dem anschauen aufhoeren und lieber erstmal probieren und dabei dann versuchen zu verstehen ;)
shader76
Beiträge: 107
Registriert: 3. März 2006 14:29

Beitrag von shader76 »

Konstruktor:

Code: Alles auswählen

Hilfe::Hilfe(QWidget *parent,Qt::WFlags f)
    : QDialog(parent,f)
{
	setWindowFlags(windowFlags()^Qt::WindowContextHelpButtonHint);
	ui.setupUi(this);
	setFixedSize(600,360);

	QPixmap *img= new QPixmap();
    img->load("images/ip-adressen.jpg"); 

	SetBackgroundImage(parent,img);
}
Funktion:

Code: Alles auswählen

void SetBackgroundImage ( QWidget *fp_widget, const QPixmap *img )
{
	QPalette newPalette = fp_widget->palette ( );
	newPalette.setBrush(QPalette::Base,QBrush (*img));
	newPalette.setBrush(QPalette::Background,QBrush (*img));
	fp_widget->setPalette ( newPalette );
}
Versuche es schon die ganze Zeit.

Ich habe hierbei 2 LNK Fehler
-shader76-
-Visual Studio.Net 2003 & QT4.1
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

...und wo sind die Fehler?
...oder hab ich was uebersehen? :)

Goos
shader76
Beiträge: 107
Registriert: 3. März 2006 14:29

Beitrag von shader76 »

---
Zuletzt geändert von shader76 am 10. Mai 2006 11:26, insgesamt 1-mal geändert.
-shader76-
-Visual Studio.Net 2003 & QT4.1
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

Nuja, du hast SetBackgroundImage als globale Funktion ausgefuehrt und nicht als Member deine Hilfe Klasse.
Diese Globale Funktion steht aber nun in deinem Code irgendwo an einer unguenstigen Stelle und kann deshalb nicht gefunden werden.

Goos
Antworten