QLabel: đặt màu của văn bản và nền


179

Làm cách nào để đặt màu văn bản và nền của a QLabel?

Câu trả lời:


272

Cách tốt nhất và được đề xuất là sử dụng Qt Style Sheet .

Để thay đổi màu văn bản và màu nền của a QLabel, đây là những gì tôi sẽ làm:

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

Bạn cũng có thể tránh sử dụng Qt Style Sheets và thay đổi QPalettemàu sắc của bạn QLabel, nhưng bạn có thể nhận được kết quả khác nhau trên các nền tảng và / hoặc kiểu khác nhau.

Như tài liệu của Qt nêu:

Sử dụng QPalette không được đảm bảo để hoạt động cho tất cả các kiểu, bởi vì các tác giả kiểu được giới hạn bởi các nguyên tắc của các nền tảng khác nhau và bởi công cụ chủ đề gốc.

Nhưng bạn có thể làm một cái gì đó như thế này:

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

Nhưng như tôi đã nói, tôi thực sự khuyên bạn không nên sử dụng bảng màu và đi cho Qt Style Sheet.


Tôi đã sử dụng phương thức setStyleSheet () và ít nhất trong Qt 4.4, nó kết thúc cuộc gọi kết nối và trong công cụ Biểu định kiểu và gây ra sự gia tăng sử dụng bộ nhớ.
Dave Johansen

Tôi đã mở một báo cáo lỗi về việc sử dụng bộ nhớ tăng lên có thể được tìm thấy ở đây .
Dave Johansen

Các colorthuộc tính là không hiệu quả. Chỉ thông qua HTML <font color="#FFFFFF">...</font>tôi mới có thể đặt màu phông chữ (thành màu trắng trong trường hợp này.
Paulo Carvalho

Có cách nào để chỉ định màu (văn bản) mặc định của màn hình của người dùng không? Sử dụng color: ;như một 'thiết lập lại' dường như để làm điều đó, nhưng đây là cách thực hành tốt, hay có một phương pháp tốt hơn?
AstroFloyd

38

Bạn có thể sử dụng QPalette, tuy nhiên bạn phải đặt setAutoFillBackground(true);để bật màu nền

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

Nó hoạt động tốt trên Windows và Ubuntu, tôi chưa chơi với bất kỳ HĐH nào khác.

Lưu ý: Vui lòng xem QPalette , phần vai trò màu để biết thêm chi tiết


Đây là yếu tố duy nhất quan trọng nhất của phương pháp BẤT K ((ngoại trừ styleSheets.)
Eliyahu Skoczylas

3
Cảm ơn bạn đã chỉ ra rằng autoFillBackground là một vấn đề quan trọng ở đây. Câu trả lời được chấp nhận ở trên không hoạt động mà không có cài đặt đó.
BSD

20

Tôi thêm câu trả lời này bởi vì tôi nghĩ nó có thể hữu ích cho bất kỳ ai.

Tôi bước vào vấn đề cài đặt màu RGBA (nghĩa là màu RGB có giá trị Alpha cho độ trong suốt) cho nhãn hiển thị màu trong ứng dụng vẽ của tôi.

Khi tôi bắt gặp câu trả lời đầu tiên, tôi không thể đặt màu RGBA. Tôi cũng đã thử những thứ như:

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

nơi colorlà một màu RGBA.

Vì vậy, giải pháp bẩn của tôi là mở rộng QLabelvà ghi đè paintEvent()phương thức lấp đầy trực tràng giới hạn của nó.

Hôm nay, tôi đã mở qt-assistantvà đọc danh sách các thuộc tính tham chiếu kiểu . May mắn thay, nó có một ví dụ cho biết như sau:

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

Đó là mở ra tâm trí của tôi trong việc làm một cái gì đó như mã dưới đây, như một ví dụ:

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

Lưu ý rằng setAutoFillBackground()thiết lập trong Falsesẽ không làm cho nó hoạt động.

Trân trọng,


14

Điều duy nhất làm việc cho tôi là html.

Và tôi thấy nó dễ thực hiện hơn bất kỳ phương pháp lập trình nào.

Đoạn mã sau thay đổi màu văn bản dựa trên tham số được truyền bởi người gọi.

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

Tương tự ở đây, cả QPalette và bảng định kiểu đều không phù hợp với tôi, rất khó chịu!
tôi không biết gì

Tôi thích cách này vì nó cũng cho phép bạn đặt một số nội dung lạ mắt khác vào trong <font/>thẻ (và là thứ quen thuộc hơn với người HTML: D) và không chỉ là màu do đó mang lại cho bạn sự linh hoạt cao hơn.
rbaleksandar 17/03/2016

Các bảng định kiểu @iknownoth hoạt động thông qua QPalette ... Mọi thứ đều sử dụng QPalette.
Victor Polevoy

13

Cách tốt nhất để đặt bất kỳ tính năng nào liên quan đến màu sắc của bất kỳ tiện ích nào là sử dụng QPalette .

Và cách dễ nhất để tìm thấy những gì bạn đang tìm kiếm là mở Qt Designer và đặt bảng màu của một nhãn hiệu và kiểm tra mã được tạo.


2
Trong trình thiết kế, nhấp vào "Biểu mẫu-> Xem mã" để xem mã được tạo.
alisami

6

Cái này hoạt động hoàn hảo

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()phương thức trả về màu đã chọn. Bạn có thể thay đổi màu nhãn bằng cách sử dụngstylesheet


1
Mặc dù mã được đánh giá cao, nó phải luôn có một lời giải thích đi kèm. Điều này không phải là dài, nhưng nó được mong đợi.
peterh - Tái lập Monica

Trong khi mã này hoạt động, có một số tối ưu hóa xác định <code> QColor color = QColorDialog :: getColor (QColor (Qt :: trắng), this, tr ("Chọn màu"); // sử dụng hàm tĩnh để chọn màu, giá trị ban đầu là màu trắng </br> ui-> nhãn-> setStyleSheet (QString ("QLabel {màu nền:% 1; màu: xanh;}" "+ colcode +"; color: blue;} ") .arg ( color.name ()); // color.name trả về chuỗi được định dạng #RRGGBB </ code>
Scott Aron Bloom
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.