Seite 1 von 2

Widgets: Transparents und Hintergrundbild

Verfasst: 16. Oktober 2005 16:40
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

Verfasst: 17. Oktober 2005 12:29
von lepsai
Sehr gut. Idee mit den Paletten gefällt mir. Bravo!

Verfasst: 1. Dezember 2005 11:08
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.... ;)

Verfasst: 12. Dezember 2005 19:53
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

Verfasst: 29. Januar 2006 00:09
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

Verfasst: 11. April 2006 15:47
von shader76
mich würde es sehr interessieren wie man ein hintergrundbild in ein QDialog Fenster einbaut. :!: :!:

Verfasst: 11. April 2006 15:52
von Goos
shader76 hat geschrieben:in ein QDialog Fenster
Ein QDialog ist doch auch ein QWidget, also wo ist das Problem? :D

Goos

Verfasst: 11. April 2006 15:55
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

Verfasst: 11. April 2006 16:13
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

Verfasst: 12. April 2006 09:46
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:

Verfasst: 12. April 2006 12:05
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 ;)

Verfasst: 12. April 2006 12:36
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

Verfasst: 12. April 2006 12:59
von Goos
...und wo sind die Fehler?
...oder hab ich was uebersehen? :)

Goos

Verfasst: 12. April 2006 14:56
von shader76
---

Verfasst: 12. April 2006 15:35
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