QLabel: mengatur warna teks dan latar belakang

180

Bagaimana cara mengatur warna teks dan latar belakang QLabel?

Regof
sumber

Jawaban:

272

Cara terbaik dan yang disarankan adalah menggunakan Qt Style Sheet .

Untuk mengubah warna teks dan warna latar belakang QLabel, inilah yang akan saya lakukan:

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

Anda juga dapat menghindari penggunaan Lembar Gaya Qt dan mengubah QPalettewarna Anda QLabel, tetapi Anda mungkin mendapatkan hasil berbeda pada platform dan / atau gaya yang berbeda.

Seperti yang dinyatakan oleh dokumentasi Qt:

Menggunakan QPalette tidak dijamin berfungsi untuk semua gaya, karena penulis gaya dibatasi oleh pedoman platform yang berbeda dan oleh mesin tema asli.

Tetapi Anda dapat melakukan sesuatu seperti ini:

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

Tapi seperti yang saya katakan, saya sangat menyarankan untuk tidak menggunakan palet dan pergi untuk Qt Style Sheet.

Jérôme
sumber
Saya telah menggunakan metode setStyleSheet () dan setidaknya di Qt 4.4 akhirnya memanggil connect dan dalam hal Style Sheet dan menyebabkan peningkatan penggunaan memori.
Dave Johansen
Saya membuka laporan bug tentang peningkatan penggunaan memori yang dapat ditemukan di sini .
Dave Johansen
The coloratribut tidak efektif. Hanya melalui HTML <font color="#FFFFFF">...</font>saya dapat mengatur warna font (menjadi putih dalam kasus ini.
Paulo Carvalho
Apakah ada cara untuk menentukan warna (teks) default dari desktop pengguna? Menggunakan color: ;sebagai 'reset' tampaknya melakukannya, tetapi apakah ini praktik yang baik, atau apakah ada metode yang lebih baik?
AstroFloyd
38

Anda dapat menggunakan QPalette, namun Anda harus mengatur setAutoFillBackground(true);untuk mengaktifkan warna latar belakang

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

Ini berfungsi dengan baik pada Windows dan Ubuntu, saya belum bermain dengan OS lain.

Catatan: Silakan lihat QPalette , bagian peran warna untuk detail lebih lanjut

Shah-nawaj Shuhan
sumber
Ini adalah elemen tunggal paling penting dari pendekatan APAPUN (kecuali styleSheets.)
Eliyahu Skoczylas
3
Terima kasih telah menunjukkan bahwa autoFillBackground adalah masalah utama di sini. Jawaban yang diterima di atas tidak berfungsi tanpa pengaturan itu.
BSD
20

Saya menambahkan jawaban ini karena saya pikir ini bisa bermanfaat bagi siapa saja.

Saya masuk ke masalah pengaturan warna RGBA (yaitu, warna RGB dengan nilai Alpha untuk transparansi) untuk label tampilan warna dalam aplikasi lukisan saya.

Ketika saya menemukan jawaban pertama, saya tidak dapat mengatur warna RGBA. Saya juga sudah mencoba hal-hal seperti:

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

di mana colorwarna RGBA.

Jadi, solusi kotor saya adalah memperluas QLabeldan mengganti paintEvent()metode mengisi recting recting-nya.

Hari ini, saya telah membuka qt-assistantdan membaca daftar properti referensi gaya . Untungnya, ada contoh yang menyatakan berikut ini:

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

Itulah yang membuka pikiran saya dalam melakukan sesuatu seperti kode di bawah ini, sebagai contoh:

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

Perhatikan bahwa setAutoFillBackground()pengaturan Falsetidak akan membuatnya berfungsi.

Salam,

Sebastian
sumber
14

Satu-satunya hal yang bekerja untuk saya adalah html.

Dan saya merasa ini jauh lebih mudah dilakukan daripada pendekatan programatik mana pun.

Kode berikut mengubah warna teks berdasarkan parameter yang dilewatkan oleh pemanggil.

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
sumber
Sama di sini, baik QPalette maupun stylesheet tidak bekerja untuk saya, sangat menjengkelkan!
Saya tidak tahu apa-apa
Saya lebih suka cara ini karena ini juga memungkinkan Anda untuk meletakkan beberapa barang mewah lainnya di dalam <font/>tag (dan merupakan sesuatu yang lebih akrab bagi orang-orang HTML: D) dan bukan hanya warna karena itu memberi Anda fleksibilitas yang lebih besar.
rbaleksandar
@iknownothing stylesheet bekerja melalui QPalette ... Semuanya menggunakan QPalette.
Victor Polevoy
13

Cara terbaik untuk mengatur fitur apa pun tentang warna widget apa pun adalah dengan menggunakan QPalette .

Dan cara termudah untuk menemukan apa yang Anda cari adalah membuka Qt Designer dan mengatur palet dari QLabel dan memeriksa kode yang dihasilkan.

alisami
sumber
2
Di desainer, klik "Formulir-> Lihat Kode" untuk melihat kode yang dihasilkan.
alisami
6

Yang ini bekerja dengan sempurna

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()metode mengembalikan warna yang dipilih. Anda dapat mengubah warna label menggunakanstylesheet

Ishan Fernando
sumber
1
Meskipun kode dihargai, itu harus selalu memiliki penjelasan yang menyertainya. Ini tidak harus lama, tetapi diharapkan.
peterh
Sementara kode ini berfungsi, ada beberapa optimisasi pasti <code> QColor color = QColorDialog :: getColor (QColor (Qt :: white), ini, tr ("Select Color"); // gunakan fungsi statis untuk memilih warna, nilai awal adalah putih </br> ui-> label-> setStyleSheet (QString ("QLabel {background-color:% 1; color: blue;}" "+ colcode +"; color: blue;} ") .arg ( color.name ()); // color.name mengembalikan string yang diformat #RRGGBB </code>
Scott Aron Bloom