web-dev-qa-db-fra.com

Comment définir la couleur d'arrière-plan d'un widget comme une zone de liste déroulante ou une double zone de sélection numérique?

J'essaie de définir la couleur d'arrière-plan d'une double zone de sélection numérique et je ne sais pas quelle fonction utiliser.

J'ai vu une fonction appelée SetBackgroundRole qui accepte un Qt::ColorRole, mais je ne sais pas comment utiliser celui-ci également.

Veuillez me faire savoir, quel est le moyen simple de changer la couleur d'arrière-plan d'un QComboBox ou QDoubleSpinBox?

34
AMM

L'utilisation d'un QPalette n'est pas garantie pour tous les styles, car les auteurs de style sont limités par les directives des différentes plates-formes et par le moteur de thème natif.

Pour vous assurer que votre couleur d'arrière-plan sera correcte, je suggère d'utiliser la Feuille de style Qt . Voici ce que j'ai fait pour changer la couleur d'arrière-plan d'un QComboBox:

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

Je n'ai pas spécifiquement essayé un QSpinBox, mais je suppose que ça fonctionnera de la même façon!

37
Jérôme

il est généralement correct, mais ne tient pas compte des widgets (comme les zones de sélection numérique et les boutons/combobox) qui utilisent un rôle d'arrière-plan différent dans la palette. Une solution plus générale serait quelque chose comme ceci:

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

Vous pouvez également consulter les descriptions des différents rôles de palette et déterminer celui que vous souhaitez, puis l'appliquer au widget contenant les autres que vous souhaitez modifier. Les changements de palette doivent se propager aux widgets enfants.

42

En fait, si vous regardez les documents Qt pour QPalette dans le cas d'une QComboBox, le rôle d'arrière-plan n'est probablement pas ce que vous voulez. Ce que vous voulez c'est:

QPalette :: Base Utilisé principalement comme couleur d'arrière-plan pour les widgets de saisie de texte, mais peut également être utilisé pour d'autres peintures - comme l'arrière-plan des listes déroulantes de la zone de liste déroulante et des poignées de la barre d'outils. Il est généralement blanc ou d'une autre couleur claire.

Voici donc le code que j'utilise pour définir la couleur d'arrière-plan d'une combo que j'utilise pour correspondre à la couleur du widget sur lequel il se trouve:

QPalette pal = myComboBox->palette();
pal.setColor(QPalette::Base, pal.color(QPalette::Window));
myComboBox->setPalette(pal);
12
Corwin Joy

Apparemment, dans Qt 4.1 et versions ultérieures, vous devez définir this->setAutoFillBackground( true ); pour que la palette applique la couleur d'arrière-plan.

11
shake

Bien que les réponses précédentes puissent définir la couleur d'arrière-plan pour un QComboBox non modifiable, elles ne fonctionnent pas pour un QComboBox modifiable. Dans ce cas, vous devez dériver le widget QLineEdit utilisé pour l'édition et réinitialiser son arrière-plan.

Voici comment je l'ai fait fonctionner:

    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);
3
Dan Blanks

Construisez une palette bleue, quel que soit le widget réel:

comboBox->setPalette( QPalette( Qt::blue ) );
1
Marc Mutz - mmutz
comboBox->setPalette( QPalette( Qt::blue ) );

Fonctionne bien pour moi!

0
Rodrigo Haas

J'essaierais quelque chose comme

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

Aucune réponse précédente ne fonctionnait pour moi, mais j'ai fait un mélange de toutes les réponses et j'ai finalement travaillé sur Qt 5.12:

QPalette pal = ui.widget->palette();
pal.setColor(QPalette::Base, Qt::red);
ui.widget->setPalette(pal);
0
Patapoom