web-dev-qa-db-fra.com

Qt5 - définition de la couleur de fond sur QPushButton et QCheckBox

J'essaie de changer la couleur d'arrière-plan d'un QAbstractButton (un QPushButton ou un QCheckBox) dans Qt5 sans avoir aucune chance.

Cela ne fait rien:

pButton->setAutoFillBackground(true);
QPalette palette = pButton->palette();
palette.setColor(QPalette::Window, QColor(Qt::blue));
pButton->setPalette(palette);
pButton->show();

et si j'essaie de changer la feuille de style:

pButton->setStyleSheet("background-color: rgb(255,255,0);");

puis Qt lève les mains au ciel et dessine un bouton ressemblant à un afwul.

Il y a une page intitulée " Comment changer la couleur de fond de QWidget " mais elle ne parle que de ces deux méthodes.

Il existe également une page " Exemples de feuilles de style Qt " qui implique que si vous souhaitez modifier la couleur d'arrière-plan, vous devez prendre en charge tous les aspects du tracé du bouton, ce qui semble excessif.

J'ai besoin de cela pour fonctionner sur Mac, Windows et Ubuntu Linux. Ce n'est vraiment pas une bonne chose si je dois tout dessiner manuellement à propos du bouton 3 fois (une fois pour chaque plate-forme).

Est-ce que je manque quelque chose d'évident?

p.s. Par "couleur d'arrière-plan", j'entends la zone entourant le bouton, pas la couleur sous le texte situé sur la face du bouton.

10
Betty Crokker

J'ai eu le même problème, mais finalement, cela a fonctionné. J'utilise Qt 5 avec le thème de couleur Fusion:

QPalette pal = button->palette();
pal.setColor(QPalette::Button, QColor(Qt::blue));
button->setAutoFillBackground(true);
button->setPalette(pal);
button->update();

Essayez ces commandes dans l'ordre exact ci-dessus, et si cela ne fonctionne toujours pas, définissez votre thème sur Fusion et réessayez.

Bonne chance!

11
Alchete

Changer la propriété dialog styleSheet fonctionne pour moi, définissez cette propriété sur:

QPushButton:pressed {
    background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1,   stop:0 rgba(60, 186, 162, 255), stop:1 rgba(98, 211, 162, 255))
}
QPushButton {
     background-color: #3cbaa2; border: 1px solid black;
     border-radius: 5px;
}

QPushButton:disabled {
    background-color: rgb(170, 170, 127)
}

 enter image description here

7
kato2

Dans la feuille de style, ajoutez une bordure: aucune; propriété. Pour une raison quelconque, cela supprime également la couleur d'arrière-plan par défaut. Exemple: background-color: rgba(46, 204, 113, 0.4); border: none;

5
Attaque

Essaye ça:

QColor col = QColor(Qt::blue);
if(col.isValid()) {
   QString qss = QString("background-color: %1").arg(col.name());
   button->setStyleSheet(qss);
}

comme mentionné à le forum QT de @goetz .

J'ai utilisé une définition différente de Qcolor col comme QColor col = QColor::fromRgb(144,238,144); et cela fonctionne pour moi.

2
abaghiyan

J'ai trouvé un moyen stupide, j'ai essayé tous les attributs de la palette et cela fonctionne pour moi lorsque je change de 'QPalette :: Base' .

    pButton->setAutoFillBackground(true);
    QPalette palette = pButton->palette();
    //palette.setColor(QPalette::Window, QColor(Qt.blue));
    //palette.setColor(QPalette::Foreground, QColor(Qt.blue));
    palette.setColor(QPalette::Base, QColor(Qt.blue));
    //palette.setColor(QPalette::AlternateBase, QColor(Qt.blue));
    //palette.setColor(QPalette::ToolTipBase, QColor(Qt.blue));
    //palette.setColor(QPalette::ToolTipText, QColor(Qt.blue));
    //palette.setColor(QPalette::Text, QColor(Qt.blue));
    //palette.setColor(QPalette::Button, QColor(Qt.blue));
    //palette.setColor(QPalette::ButtonText, QColor(Qt.blue));
    //palette.setColor(QPalette::BrightText, QColor(Qt.blue));
    pButton->setPalette(palette);
    pButton->show();

lien de référence: Comment obtenir une propriété de feuille de style?

0
whisper