[gelöst] [Qt4] Hintergrundfarbe setzen

Alles rund um die Programmierung mit Qt
Antworten
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

[gelöst] [Qt4] Hintergrundfarbe setzen

Beitrag von FlorianBecker »

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?
Zuletzt geändert von FlorianBecker am 22. September 2005 13:15, insgesamt 1-mal geändert.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Re: [Qt4] Hintergrundfarbe setzen

Beitrag von macman »

FlorianBecker hat geschrieben:Gibt es in Qt keine Möglichkeit, außer über QPalette die Hintergrundfarbe zu setzen?
Ich war auch etwas bestürzt, für meine Zwecke reichte aber folgendes:
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.
kowi1134
Beiträge: 120
Registriert: 1. Mai 2005 17:48
Wohnort: Arnsberg

Beitrag von kowi1134 »

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:

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

Beitrag von lepsai »

@Florian:

Warum bist du denn überhaupt auf Q4 umgestiegen? Macht es Sinn, sich mit solchen Problemen zu beschäftigen?
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

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

Beitrag von FlorianBecker »

Danke euch, also das von kowi ist perfekt. Das sollten die Trolle am besten gleich selbst in den Toolkit mit aufnehmen.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

FlorianBecker hat geschrieben:Danke euch, also das von kowi ist perfekt.
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.
kowi1134
Beiträge: 120
Registriert: 1. Mai 2005 17:48
Wohnort: Arnsberg

Beitrag von kowi1134 »

Danke an Florian für diese schmeichelhaften Worte!

Naja, einen Fehler würde ich das nicht nennen! :)
macman hat geschrieben:
FlorianBecker hat geschrieben:Danke euch, also das von kowi ist perfekt.
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.
Folgendes ist nicht möglich:

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();
	}
}
Da bekommst Du die Fehlermeldung:
Compiler hat geschrieben:passing `const QPalette' as `this' argument of `void QPalette::setColor(QPalette::ColorRole, const QColor&)' discards qualifiers
Und ich vermute mal, dass das daran liegt, dass die Funktion "const QPalette & palette () const" explizit das Widget nicht verändern darf.

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();
	}
}
Ciao
klogg
Beiträge: 129
Registriert: 5. September 2005 17:00
Wohnort: Hann. Münden

Beitrag von klogg »

Ich möchte noch was anmerken.

(widget->palette()).setColor( QPalette::Background, color );

Sowas funktioniert schon allein deshalb nicht,
weil dir ja der Aufruf widget->palette() eine Kopie zurück gibt.
Selbst wenn du die dann veränderst,
das Widget kriegt davon nichts mit.

HENNING
kowi1134
Beiträge: 120
Registriert: 1. Mai 2005 17:48
Wohnort: Arnsberg

Beitrag von kowi1134 »

klogg hat geschrieben:Sowas funktioniert schon allein deshalb nicht,
weil dir ja der Aufruf widget->palette() eine Kopie zurück gibt.
Öh, ... moment mal!

In der Doku heißt es
const QPalette & palette () const
und das ist doch eine Referenz da im Rückgabewert, oder nicht?

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
Antworten