[gelöst] [Qt4] Hintergrundfarbe setzen
-
FlorianBecker
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
[gelöst] [Qt4] Hintergrundfarbe setzen
Hallo,
verstehe ich das richtig? Gibt es in Qt keine Möglichkeit, außer über QPalette die Hintergrundfarbe zu setzen?
Das ist doch ziemlich umständlich, jedes mal alle Farben per Hand zu setzen und wenn das Farbschema mit meinem nicht zusammenpasst, dann bringt die ganze Einfärbung nichts mehr. Jemand eine Idee? Vielleicht dieses Problem schon mal elegant gelöst?
verstehe ich das richtig? Gibt es in Qt keine Möglichkeit, außer über QPalette die Hintergrundfarbe zu setzen?
Das ist doch ziemlich umständlich, jedes mal alle Farben per Hand zu setzen und wenn das Farbschema mit meinem nicht zusammenpasst, dann bringt die ganze Einfärbung nichts mehr. Jemand eine Idee? Vielleicht dieses Problem schon mal elegant gelöst?
Zuletzt geändert von FlorianBecker am 22. September 2005 13:15, insgesamt 1-mal geändert.
Re: [Qt4] Hintergrundfarbe setzen
Ich war auch etwas bestürzt, für meine Zwecke reichte aber folgendes:FlorianBecker hat geschrieben:Gibt es in Qt keine Möglichkeit, außer über QPalette die Hintergrundfarbe zu setzen?
Qt hat geschrieben:QPalette::QPalette ( const QColor & button )
Constructs a palette from the button color. The other colors are automatically calculated, based on this color. Background will be the button color as well.
Hallo!
Ob elegant oder nicht, ich habe mich auch schon über diese Herangehensweise gewundert und mir dann eine kleine Funktion geschrieben, die das Leben etwas erleichtert:
Ciao
Ob elegant oder nicht, ich habe mich auch schon über diese Herangehensweise gewundert und mir dann eine kleine Funktion geschrieben, die das Leben etwas erleichtert:
Code: Alles auswählen
/**
* This global function sets the background color of "widget" to "color"
* @param QWidget * widget
* @param QColor & color
* @return void
*
* @see QWidget
* @see QColor
* @see QPalette
*/
void setWidgetBackgroundColor(QWidget * widget, const QColor & color)
{
assert(widget != NULL);
if (color.isValid())
{
QPalette palette;
palette.setColor( QPalette::Background, color );
widget->setPalette( palette );
widget->setBackgroundRole( QPalette::Background );
widget->repaint();
}
}-
FlorianBecker
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
Das Problem ist, dass es Qt3 ja nicht immer geben wird und mit dem 4.1-snap vom 20.09.2005 passen die momentanen Tests alle.
Ich brauche Qt4 weil:
- die einen SQLite Treiber für die Version 3 haben
- die Layouts teilweise verbessert wurden und ich z.B. zusammenziehende Layouts benötige, die man zusammen schieben und auseinander ziehen kann, wobei die Items dann je nachdem übereinander oder nebeneinander sind.
- es möglich sein wird mit ohne viel Aufwand ComboBoxen, CheckBoxen usw. zu skalieren anstatt den ganzen Style neu zu übersetzen.
- weil die Designer Dateien wesentlich besser verarbeitet werden können als noch mit der 3er.
- weil es Ressourcen gibt.
... und noch einige Kleinigkeiten.
Ich finde bei Qt nur erschreckend, das man immer über die Dörfer gehen muss. Z.B. beim verändern der Größe von Headern, dass es keine Standard Operator für const char * und std::string gibt.
Also alles in allem ist es momentan gar nicht mehr so schlecht. Aber an der API werden Sie wohl noch hier und da Vereinfachungen machen müssen. Ansonsten hast du natürlich Recht, dass Problem ist nur, irgendwann muss man sowieso portieren bzw. Qt4 verwenden.
Ich brauche Qt4 weil:
- die einen SQLite Treiber für die Version 3 haben
- die Layouts teilweise verbessert wurden und ich z.B. zusammenziehende Layouts benötige, die man zusammen schieben und auseinander ziehen kann, wobei die Items dann je nachdem übereinander oder nebeneinander sind.
- es möglich sein wird mit ohne viel Aufwand ComboBoxen, CheckBoxen usw. zu skalieren anstatt den ganzen Style neu zu übersetzen.
- weil die Designer Dateien wesentlich besser verarbeitet werden können als noch mit der 3er.
- weil es Ressourcen gibt.
... und noch einige Kleinigkeiten.
Ich finde bei Qt nur erschreckend, das man immer über die Dörfer gehen muss. Z.B. beim verändern der Größe von Headern, dass es keine Standard Operator für const char * und std::string gibt.
Also alles in allem ist es momentan gar nicht mehr so schlecht. Aber an der API werden Sie wohl noch hier und da Vereinfachungen machen müssen. Ansonsten hast du natürlich Recht, dass Problem ist nur, irgendwann muss man sowieso portieren bzw. Qt4 verwenden.
-
FlorianBecker
- Beiträge: 1213
- Registriert: 2. Dezember 2004 10:54
- Kontaktdaten:
Danke an Florian für diese schmeichelhaften Worte!
Naja, einen Fehler würde ich das nicht nennen!
Da bekommst Du die Fehlermeldung:
Und folgendes macht dann vom Speicher-/Rechenaufwand auch keinen Unterschied zu meiner Version. Das Einzige, was besser ist, ist das sonstige Einstellungen der QPalette durch die Kopie übernommen werden:
Ciao
Naja, einen Fehler würde ich das nicht nennen!
Folgendes ist nicht möglich:macman hat geschrieben:Hat aber doch noch einen Fehler. Ich würde mir die Palette von dem Widget holen und dort die Farbe ändern, anstatt ihm eine neue zu verpassen. Schließlich wird nur ein Wert geändert.FlorianBecker hat geschrieben:Danke euch, also das von kowi ist perfekt.
Code: Alles auswählen
void setWidgetBackgroundColor(QWidget * widget, const QColor & color)
{
assert(widget != NULL);
if (color.isValid())
{
(widget->palette()).setColor( QPalette::Background, color );
widget->repaint();
}
}Und ich vermute mal, dass das daran liegt, dass die Funktion "const QPalette & palette () const" explizit das Widget nicht verändern darf.Compiler hat geschrieben:passing `const QPalette' as `this' argument of `void QPalette::setColor(QPalette::ColorRole, const QColor&)' discards qualifiers
Und folgendes macht dann vom Speicher-/Rechenaufwand auch keinen Unterschied zu meiner Version. Das Einzige, was besser ist, ist das sonstige Einstellungen der QPalette durch die Kopie übernommen werden:
Code: Alles auswählen
void setWidgetBackgroundColor(QWidget * widget, const QColor & color)
{
assert(widget != NULL);
if (color.isValid())
{
QPalette palette( widget->palette() );
palette.setColor( QPalette::Background, color );
widget->setPalette( palette );
widget->setBackgroundRole( QPalette::Background );
widget->repaint();
}
}Öh, ... moment mal!klogg hat geschrieben:Sowas funktioniert schon allein deshalb nicht,
weil dir ja der Aufruf widget->palette() eine Kopie zurück gibt.
In der Doku heißt es
und das ist doch eine Referenz da im Rückgabewert, oder nicht?const QPalette & palette () const
Das erste "const" heißt, dass ich die QPalette nicht verändern kann. Wäre das und das zweite "const" auch nicht da, dann würde das Widget schon etwas mitbekommen.
Ciao