QLabel: imposta il colore del testo e dello sfondo


180

Come posso impostare il colore del testo e lo sfondo di un QLabel?

Risposte:


272

Il modo migliore e consigliato è usare il foglio di stile Qt .

Per cambiare il colore del testo e il colore di sfondo di un QLabel, ecco cosa farei:

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

Potresti anche evitare di usare i fogli di stile Qt e cambiare i QPalettetuoi colori QLabel, ma potresti ottenere risultati diversi su piattaforme e / o stili diversi.

Come afferma la documentazione di Qt:

L'uso di una QPalette non è garantito per tutti gli stili, poiché gli autori degli stili sono limitati dalle linee guida delle diverse piattaforme e dal motore del tema nativo.

Ma potresti fare qualcosa del genere:

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

Ma come ho detto, consiglio vivamente di non usare la tavolozza e scegliere il foglio di stile Qt.


Ho usato il metodo setStyleSheet () e almeno in Qt 4.4 finisce per chiamare connect e nelle cose del foglio di stile e causare un aumento dell'uso della memoria.
— Dave Johansen,

Ho aperto una segnalazione di bug sull'aumento dell'utilizzo della memoria che può essere trovato qui .
— Dave Johansen,

L' colorattributo è inefficace. Solo tramite HTML <font color="#FFFFFF">...</font>sono stato in grado di impostare il colore del carattere (in questo caso il bianco.
— Paulo Carvalho,

Esiste un modo per specificare il colore (testo) predefinito del desktop dell'utente? L'uso color: ;come 'reset' sembra farlo, ma questa è una buona pratica o esiste un metodo migliore?
— AstroFloyd

38

È possibile utilizzare QPalette, tuttavia è necessario impostare setAutoFillBackground(true);per abilitare il colore di sfondo

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");

Funziona bene su Windows e Ubuntu, non ho giocato con nessun altro sistema operativo.

Nota: consultare QPalette , sezione ruolo colore per maggiori dettagli


Questo è il singolo elemento più importante di QUALSIASI approccio (tranne i fogli di stile.)
— Eliyahu Skoczylas

3
Grazie per aver sottolineato che AutoFillBackground è un problema chiave qui. La risposta accettata sopra non funziona senza tale impostazione.
— BSD

20

Aggiungo questa risposta perché penso possa essere utile a chiunque.

Passo nel problema di impostare i colori RGBA (ovvero, il colore RGB con un valore alfa per la trasparenza) per le etichette con display a colori nella mia applicazione di pittura.

Quando ho trovato la prima risposta, non sono stato in grado di impostare un colore RGBA. Ho anche provato cose come:

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

dove colorè un colore RGBA.

Quindi, la mia soluzione sporca era estendere QLabele scavalcarepaintEvent() metodo riempiendo il suo rettangolo di limitazione.

Oggi ho aperto qt-assistante letto l' elenco delle proprietà dei riferimenti di stile . Affortunatamente, ha un esempio che afferma quanto segue:

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

Questo mi apre la mente nel fare qualcosa come il codice qui sotto, ad esempio:

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+"); }")

Nota che il setAutoFillBackground()set in Falsenon lo farà funzionare.

Saluti,


14

L'unica cosa che ha funzionato per me era HTML.

E l'ho trovato molto più semplice da fare rispetto a qualsiasi approccio programmatico.

Il codice seguente modifica il colore del testo in base a un parametro passato da un chiamante.

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);
}

Lo stesso qui, né QPalette né i fogli di stile hanno funzionato per me, molto fastidiosi!
— so nulla del

Preferisco così perché ti consente anche di inserire alcune altre cose fantasiose all'interno del <font/>tag (ed è qualcosa di più familiare alle persone HTML: D) e non solo un colore, quindi ti dà una maggiore flessibilità.
— rbaleksandar,

I fogli di stile @iknownothing funzionano con QPalette ... Tutto utilizza QPalette.
— Victor Polevoy,

13

Il modo migliore per impostare qualsiasi funzione relativa ai colori di qualsiasi widget è usare QPalette .

E il modo più semplice per trovare quello che stai cercando è aprire Qt Designer e impostare la tavolozza di un QLabel e controllare il codice generato.


2
In Designer, fai clic su "Modulo-> Visualizza codice" per visualizzare il codice generato.
— alisami,

6

Questo funziona perfettamente

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()Il metodo restituisce il colore selezionato. Puoi cambiare il colore dell'etichetta usandostylesheet


1
Sebbene il codice sia apprezzato, dovrebbe sempre avere una spiegazione di accompagnamento. Questo non deve essere lungo, ma è previsto.
— Peter - Ripristina Monica il

Mentre questo codice funziona, ci sono alcune ottimizzazioni definite <code> QColor color = QColorDialog :: getColor (QColor (Qt :: white), this, tr ("Select Color"); // usa la funzione statica per selezionare il colore, il valore iniziale è bianco </br> ui-> label-> setStyleSheet (QString ("QLabel {background-color:% 1; color: blue;}" "+ colcode +"; color: blue;} ") .arg ( color.name ()); // color.name restituisce una stringa formattata #RRGGBB </code>
— Scott Aron Bloom
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.