QLabel: définir la couleur du texte et de l'arrière-plan

180

Comment définir la couleur du texte et de l'arrière-plan d'un QLabel?

Regof
la source

Réponses:

272

La meilleure manière recommandée est d'utiliser la feuille de style Qt .

Pour changer la couleur du texte et la couleur d'arrière-plan d'un QLabel, voici ce que je ferais:

QLabel* pLabel = new QLabel;
pLabel->setStyleSheet("QLabel { background-color : red; color : blue; }");

Vous pouvez également éviter d'utiliser les feuilles de style Qt et changer les QPalettecouleurs de votre QLabel, mais vous pourriez obtenir des résultats différents sur différentes plates-formes et / ou styles.

Comme l'indique la documentation Qt:

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

Mais vous pouvez faire quelque chose comme ceci:

 QPalette palette = ui->pLabel->palette();
 palette.setColor(ui->pLabel->backgroundRole(), Qt::yellow);
 palette.setColor(ui->pLabel->foregroundRole(), Qt::yellow);
 ui->pLabel->setPalette(palette);

Mais comme je l'ai dit, je suggère fortement de ne pas utiliser la palette et d'opter pour la feuille de style Qt.

Jérôme
la source
J'ai utilisé la méthode setStyleSheet () et au moins dans Qt 4.4, cela finit par appeler connect et dans le truc de la feuille de style et provoquant une augmentation de l'utilisation de la mémoire.
Dave Johansen
J'ai ouvert un rapport de bogue sur l'utilisation accrue de la mémoire qui peut être trouvé ici .
Dave Johansen
L' colorattribut est inefficace. Uniquement via HTML, <font color="#FFFFFF">...</font>j'ai pu définir la couleur de la police (en blanc dans ce cas.
Paulo Carvalho
Existe-t-il un moyen de spécifier la couleur par défaut (texte) du bureau de l'utilisateur? Utiliser color: ;comme une «réinitialisation» semble le faire, mais est-ce une bonne pratique ou existe-t-il une meilleure méthode?
AstroFloyd
38

Vous pouvez utiliser QPalette, mais vous devez définir setAutoFillBackground(true);pour activer la couleur d'arrière-plan

QPalette sample_palette;
sample_palette.setColor(QPalette::Window, Qt::white);
sample_palette.setColor(QPalette::WindowText, Qt::blue);

sample_label->setAutoFillBackground(true);
sample_label->setPalette(sample_palette);
sample_label->setText("What ever text");

Cela fonctionne bien sur Windows et Ubuntu, je n'ai joué avec aucun autre système d'exploitation.

Remarque: veuillez consulter QPalette , section des rôles de couleur pour plus de détails

Shah-nawaj Shuhan
la source
C'est l'élément le plus important de TOUTE approche (sauf styleSheets.)
Eliyahu Skoczylas
3
Merci de souligner que l'autoFillBackground est un problème clé ici. La réponse acceptée ci-dessus ne fonctionne pas sans ce paramètre.
BSD
20

J'ajoute cette réponse parce que je pense qu'elle pourrait être utile à n'importe qui.

J'entre dans le problème de la définition des couleurs RGBA (c'est-à-dire une couleur RVB avec une valeur Alpha pour la transparence) pour les étiquettes d'affichage couleur dans mon application de peinture.

Lorsque je suis tombé sur la première réponse, je n'ai pas pu définir une couleur RGBA. J'ai également essayé des choses comme:

myLabel.setStyleSheet("QLabel { background-color : %s"%color.name())

colorest une couleur RGBA.

Donc, ma solution sale était d'étendre QLabelet de remplacer la paintEvent()méthode remplissant son rectangle de délimitation.

Aujourd'hui, j'ai ouvert qt-assistantet lu la liste des propriétés de référence de style . Heureusement, il a un exemple qui indique ce qui suit:

QLineEdit { background-color: rgb(255, 0, 0) }

Cela m'ouvre l'esprit en faisant quelque chose comme le code ci-dessous, à titre d'exemple:

myLabel= QLabel()
myLabel.setAutoFillBackground(True) # This is important!!
color  = QtGui.QColor(233, 10, 150)
alpha  = 140
values = "{r}, {g}, {b}, {a}".format(r = color.red(),
                                     g = color.green(),
                                     b = color.blue(),
                                     a = alpha
                                     )
myLabel.setStyleSheet("QLabel { background-color: rgba("+values+"); }")

Notez que le setAutoFillBackground()paramétrage Falsene le fera pas fonctionner.

Cordialement,

Sébastien
la source
14

La SEULE chose qui a fonctionné pour moi était le html.

Et j'ai trouvé que c'était beaucoup plus facile à faire que n'importe quelle approche programmatique.

Le code suivant modifie la couleur du texte en fonction d'un paramètre passé par un appelant.

enum {msg_info, msg_notify, msg_alert};
:
:
void bits::sendMessage(QString& line, int level)
{
    QTextCursor cursor = ui->messages->textCursor();
    QString alertHtml  = "<font color=\"DeepPink\">";
    QString notifyHtml = "<font color=\"Lime\">";
    QString infoHtml   = "<font color=\"Aqua\">";
    QString endHtml    = "</font><br>";

    switch(level)
    {
        case msg_alert:  line = alertHtml % line; break;
        case msg_notify: line = notifyHtml % line; break;
        case msg_info:   line = infoHtml % line; break;
        default:         line = infoHtml % line; break;
    }

    line = line % endHtml;
    ui->messages->insertHtml(line);
    cursor.movePosition(QTextCursor::End);
    ui->messages->setTextCursor(cursor);
}
paie
la source
Pareil ici, ni QPalette ni les feuilles de style n'ont fonctionné pour moi, très ennuyeux!
Je ne sais rien
Je préfère cette façon car cela vous permet également de mettre d'autres éléments de fantaisie à l'intérieur de la <font/>balise (et c'est quelque chose de plus familier aux gens HTML: D) et pas seulement une couleur, donc cela vous donne une plus grande flexibilité.
rbaleksandar
Les feuilles de style @iknownothing fonctionnent avec QPalette ... Tout utilise QPalette.
Victor Polevoy
13

La meilleure façon de définir une fonctionnalité concernant les couleurs de tout widget est d'utiliser QPalette .

Et le moyen le plus simple de trouver ce que vous recherchez est d'ouvrir Qt Designer et de définir la palette d'un QLabel et de vérifier le code généré.

Alisami
la source
2
Dans le concepteur, cliquez sur "Form-> Afficher le code" pour voir le code généré.
alisami
6

Celui-ci fonctionne parfaitement

QColorDialog *dialog = new QColorDialog(this);
QColor color=  dialog->getColor();
QVariant variant= color;
QString colcode = variant.toString();
ui->label->setStyleSheet("QLabel { background-color :"+colcode+" ; color : blue; }");

getColor()renvoie la couleur sélectionnée. Vous pouvez changer la couleur de l'étiquette en utilisantstylesheet

Ishan Fernando
la source
1
Bien que le code soit apprécié, il doit toujours être accompagné d'une explication. Cela ne doit pas être long, mais c'est attendu.
peterh
Pendant que ce code fonctionne, il existe quelques optimisations définies <code> QColor color = QColorDialog :: getColor (QColor (Qt :: white), this, tr ("Select Color"); // utilisez la fonction statique pour sélectionner la couleur, la valeur initiale est white </br> ui-> label-> setStyleSheet (QString ("QLabel {background-color:% 1; color: blue;}" "+ colcode +"; color: blue;} ") .arg ( color.name ()); // color.name renvoie une chaîne formatée #RRGGBB </code>
Scott Aron Bloom