2008-10-07 11 views
30

Ich versuche, die Hintergrundfarbe für eine Doppel-Spin-Box einzustellen, und ich bin mir nicht sicher, welche Funktion ich verwenden soll.Wie stelle ich die Hintergrundfarbe eines Widgets wie Combobox oder Doppel-Spin-Box ein?

Ich sah eine Funktion namens SetBackgroundRole, die eine Qt::ColorRole akzeptiert, aber ich bin mir nicht sicher, wie man dieses auch verwendet.

Bitte lassen Sie mich wissen, was ist die einfache Möglichkeit, die Hintergrundfarbe eines QComboBox oder QDoubleSpinBox zu ändern?

Antwort

35

ein QPalette Verwendung ist nicht für alle Arten garantiert arbeiten, weil Stil Autoren durch die verschiedenen Plattformen Richtlinien eingeschränkt sind und durch die native Thema Motor.

Um sicherzustellen, dass Ihre Hintergrundfarbe korrekt ist, würde ich vorschlagen, die Qt Style Sheet zu verwenden. Hier ist, was ich tat, die Hintergrundfarbe eines QComboBox zu ändern:

myComboBox->setStyleSheet("QComboBox { background-color: blue; }");

Ich habe nicht speziell versucht, für eine QSpinBox, aber ich denke, es wird die gleiche Arbeit!

+7

Die Verwendung eines Stylesheets zum Einstellen der Hintergrundfarbe ist nicht der richtige Ansatz, es sei denn, Sie möchten auch die anderen Untersteuerelemente in der QComboBox formatieren (drop-down und down-arrow). Beachten Sie den Hinweis in der Qt-Dokumentation: "Wenn bei komplexen Widgets wie QComboBox und QScrollBar eine Eigenschaft oder ein Untersteuerelement angepasst wird, müssen auch alle anderen Eigenschaften oder Untersteuerelemente angepasst werden." Link: http://doc.trolltech.com/4.5/stylesheet-customizing.html – Krsna

0

würde ich versuchen, so etwas wie

QPalette pal = widget.palette(); 
pal.setColor(QPalette::Window, Qt::blue); 
widget.setPalette(pal); 
+1

ich versucht das zu tun, aber irgendwie die Hintergrundfarbe ist nicht immer aktualisiert. Irgendeine Idee, was der Grund sein könnte. Gibt es sonst noch etwas, das du angenommen hast? – AMM

+0

Was ich meine ist, sollte ich etwas wie ein Repaint oder etwas nach dem Ausführen der set aufrufenPalette – AMM

+0

Ich habe kein QT hier zu testen, aber QWidget :: update() sollte ein Repaint erzwingen. Haben Sie Jérômes Lösung ausprobiert? – fhe

40

Dies ist im Allgemeinen korrekt, berücksichtigt jedoch nicht die Widgets (wie Drehfelder und Schaltflächen/Kombinationsfelder), die eine andere Hintergrundrolle in der Palette verwenden. Eine allgemeine Lösung wäre so etwas wie dieses:

QPalette pal = widget.palette(); 
pal.setColor(widget.backgroundRole(), Qt::blue); 
widget.setPalette(pal); 

Alternativ Sie in den Beschreibungen der verschiedenen Palettenrollen aussehen könnte und die man herausfinden, die Sie wollen, dann gilt es auf das Widget die anderen aus, die Sie geändert möchten . Die Palettenänderungen sollten an die untergeordneten Widgets weitergegeben werden.

1

eine Palette Konstrukt, das blau ist egal, was die tatsächliche widget:

comboBox->setPalette(QPalette(Qt::blue)); 
11

Offenbar in Qt 4.1 und weiter, müssen Sie this->setAutoFillBackground(true); für die Palette auf die Hintergrundfarbe zu übernehmen.

+0

danke, das fehlte –

+0

sollte dies ein Kommentar sein – brettmichaelgreen

10

Wenn Sie die Qt-Dokumente für QPalette im Falle einer QComboBox betrachten, ist die Hintergrundrolle wahrscheinlich nicht das, was Sie wollen. Was Sie wollen, ist:

QPalette :: Base Gebrauchte meist als Hintergrundfarbe für die Texteingabe Widgets, sondern kann auch für andere Malerei verwendet werden - wie der Hintergrund der Combobox Dropdown-Listen und die Symbolleiste Griffe. Es ist normalerweise weiß oder eine andere helle Farbe.

So, hier ist der Code, den ich die Hintergrundfarbe von einem Kombinationsfeld zu setzen verwende ich die Farbe des Widgets anpassen bin mit ihm auf:

QPalette pal = myComboBox->palette(); 
pal.setColor(QPalette::Base, pal.color(QPalette::Window)); 
myComboBox->setPalette(pal); 
0
comboBox->setPalette(QPalette(Qt::blue)); 

funktioniert gut für mich!

+0

Ich habe das versucht, aber meins funktioniert nur, wenn die QSpinBox deaktiviert ist (dh wenn die QSpinBox ist enaled, die Farbe wieder normal). Irgendeine Idee? – ismailsunni

3

Während die vorherigen Antworten möglicherweise die Hintergrundfarbe für eine nicht bearbeitbare QComboBox festlegen, funktionieren sie nicht für eine bearbeitbare QComboBox. In diesem Fall müssen Sie das Widget QLineEdit für die Bearbeitung ableiten und dessen Hintergrund zurücksetzen.

Hier ist, wie ich es an die Arbeit:

QComboBox *myComboBox = new QComboBox(); 
    myComboBox->setEditable(true); 
    QColor backColor = QColor(246, 230, 230); 
    QLineEdit *lineEditor = myComboBox->lineEdit(); 
    QPalette pal = lineEditor->palette(); 
    pal.setColor(QPalette::Base, backColor); 
    lineEditor->setPalette(pal);