Seite 1 von 1

[gelöst] [Qt4] Hintergrundfarbe setzen

Verfasst: 22. September 2005 11:57
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?

Re: [Qt4] Hintergrundfarbe setzen

Verfasst: 22. September 2005 12:08
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.

Verfasst: 22. September 2005 12:09
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

Verfasst: 22. September 2005 12:23
von lepsai
@Florian:

Warum bist du denn überhaupt auf Q4 umgestiegen? Macht es Sinn, sich mit solchen Problemen zu beschäftigen?

Verfasst: 22. September 2005 13:13
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.

Verfasst: 22. September 2005 13:19
von FlorianBecker
Danke euch, also das von kowi ist perfekt. Das sollten die Trolle am besten gleich selbst in den Toolkit mit aufnehmen.

Verfasst: 22. September 2005 14:01
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.

Verfasst: 22. September 2005 14:47
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

Verfasst: 22. September 2005 15:09
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

Verfasst: 22. September 2005 15:18
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