QLabel: ตั้งค่าสีของข้อความและพื้นหลัง


180

ฉันจะตั้งค่าสีของข้อความและพื้นหลังของ a ได้QLabelอย่างไร?

คำตอบ:


272

วิธีที่ดีที่สุดและแนะนำคือการใช้Qt Style Sheet

หากต้องการเปลี่ยนสีข้อความและสีพื้นหลังของ a QLabelนี่คือสิ่งที่ฉันจะทำ:

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

คุณสามารถหลีกเลี่ยงการใช้สไตล์ชีท Qt และเปลี่ยนQPaletteสีของคุณQLabelแต่คุณอาจได้รับผลลัพธ์ที่แตกต่างกันในแพลตฟอร์มและ / หรือสไตล์ที่แตกต่างกัน

ในฐานะที่เป็นเอกสารประกอบของ Qt:

การใช้ QPalette นั้นไม่ได้รับประกันว่าจะสามารถใช้งานได้กับทุกสไตล์เพราะผู้เขียนสไตล์นั้นถูก จำกัด โดยแนวทางของแพลตฟอร์มที่แตกต่างกันและโดยชุดรูปแบบดั้งเดิม

แต่คุณสามารถทำสิ่งนี้:

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

แต่อย่างที่ฉันบอกไปแล้วฉันไม่แนะนำให้ใช้พาเล็ทและไปหาสไตล์ของ Qt


ฉันได้ใช้เมธอด setStyleSheet () และอย่างน้อยใน Qt 4.4 มันสิ้นสุดการโทรเชื่อมต่อและในสไตล์ชีตสิ่งและทำให้การใช้หน่วยความจำเพิ่มขึ้น
Dave Johansen

ผมเปิดรายงานข้อผิดพลาดเกี่ยวกับการใช้งานหน่วยความจำที่เพิ่มขึ้นซึ่งสามารถพบได้ที่นี่
Dave Johansen

colorแอตทริบิวต์ไม่ได้ผล ผ่าน HTML เท่านั้น<font color="#FFFFFF">...</font>ฉันสามารถตั้งค่าสีตัวอักษร (เป็นสีขาวได้ในกรณีนี้
เปาโลคาร์วัลโญ่

มีวิธีการระบุสีเริ่มต้น (ข้อความ) ของเดสก์ท็อปของผู้ใช้หรือไม่? การใช้color: ;เป็น 'รีเซ็ต' ดูเหมือนว่าจะทำ แต่วิธีนี้เป็นการปฏิบัติที่ดีหรือมีวิธีที่ดีกว่า
AstroFloyd

38

คุณสามารถใช้ QPalette ได้ แต่คุณต้องตั้งค่าsetAutoFillBackground(true);ให้เปิดใช้งานสีพื้นหลัง

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

มันทำงานได้ดีบน Windows และ Ubuntu ฉันไม่ได้เล่นกับระบบปฏิบัติการอื่น

หมายเหตุ: โปรดดูQPaletteส่วนบทบาทสีสำหรับรายละเอียดเพิ่มเติม


นี่เป็นองค์ประกอบเดียวที่สำคัญที่สุดของวิธีการใด ๆ (ยกเว้น styleSheets)
Eliyahu Skoczylas

3
ขอบคุณสำหรับการชี้ให้เห็นว่า autoFillBackground เป็นปัญหาสำคัญที่นี่ คำตอบที่ยอมรับด้านบนไม่ทำงานหากไม่มีการตั้งค่านั้น
BSD

20

ฉันเพิ่มคำตอบนี้เพราะฉันคิดว่าอาจเป็นประโยชน์กับทุกคน

ฉันก้าวเข้าสู่ปัญหาของการตั้งค่าRGBAสี (นั่นคือสี RGB พร้อมค่าอัลฟ่าเพื่อความโปร่งใส) สำหรับป้ายกำกับการแสดงสีในแอปพลิเคชันการวาดภาพของฉัน

เมื่อฉันเจอคำตอบแรกฉันไม่สามารถตั้งค่าสี RGBA ได้ ฉันได้ลองสิ่งต่างๆเช่น:

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

ที่ไหน colorเป็นสีที่ RGBA

ดังนั้นทางออกที่สกปรกของฉันคือการขยายQLabelและแทนที่paintEvent()วิธีการกรอก rect ขอบเขตของมัน

วันนี้ผมได้เปิดqt-assistantและอ่านรายชื่อคุณสมบัติอ้างอิงสไตล์ โชคดีที่มันมีตัวอย่างที่ระบุสิ่งต่อไปนี้:

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

ขอบคุณที่เปิดใจของฉันในการทำบางสิ่งบางอย่างเช่นรหัสด้านล่างเป็นตัวอย่าง:

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

โปรดทราบว่าการsetAutoFillBackground()ตั้งค่าในFalseจะไม่ทำงาน

ความนับถือ,


14

สิ่งเดียวที่ใช้ได้ผลสำหรับฉันคือ html

และฉันก็พบว่ามันเป็นสิ่งที่ทำได้ง่ายกว่าวิธีการเขียนโปรแกรมใด ๆ

รหัสต่อไปนี้เปลี่ยนสีข้อความตามพารามิเตอร์ที่ส่งผ่านโดยผู้โทร

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

เหมือนกันที่นี่ทั้ง QPalette และสไตล์ชีทไม่เหมาะกับฉันเลยน่ารำคาญมาก!
ฉันไม่รู้อะไรเลย

ฉันชอบวิธีนี้เนื่องจากช่วยให้คุณสามารถใส่สิ่งแฟนซีอื่น ๆ ไว้ใน<font/>แท็ก (และเป็นสิ่งที่คุ้นเคยกับคน HTML: D) และไม่ใช่แค่สีดังนั้นมันจึงให้ความยืดหยุ่นมากขึ้น
rbaleksandar

สไตล์ @iknownothing ทำงานผ่าน QPalette ... ทุกอย่างใช้ QPalette
Victor Polevoy

13

วิธีที่ดีที่สุดในการตั้งค่าคุณสมบัติเกี่ยวกับสีของวิดเจ็ตใด ๆ คือการใช้QPalette QPalette

และวิธีที่ง่ายที่สุดในการค้นหาสิ่งที่คุณกำลังมองหาคือเปิด Qt Designer และตั้งจานสีของ QLabel และตรวจสอบรหัสที่สร้างขึ้น


2
ในผู้ออกแบบให้คลิก "Form-> View Code" เพื่อดูรหัสที่สร้างขึ้น
alisami

6

อันนี้ทำงานได้อย่างสมบูรณ์

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()วิธีการส่งกลับสีที่เลือก คุณสามารถเปลี่ยนสีของฉลากโดยใช้stylesheet


1
แม้ว่ารหัสจะได้รับการชื่นชม แต่ก็ควรมีคำอธิบายประกอบ สิ่งนี้ไม่จำเป็นต้องยาว แต่ก็คาดว่า
peterh - Reinstate Monica

ในขณะที่รหัสนี้ใช้งานได้มีการเพิ่มประสิทธิภาพที่แน่นอน <code> QColor color = QColorDialog :: getColor (QColor (Qt :: white) นี่คือ tr ("Select Color"); // ใช้ฟังก์ชั่นแบบคงที่เพื่อเลือกสี ค่าเริ่มต้นคือสีขาว </br> ui-> label-> setStyleSheet (QString ("QLabel {พื้นหลังสี:% 1; สี: สีน้ำเงิน;}" "+ colcode +"; สี: สีน้ำเงิน;} ") .arg ( color.name ()); // color.name ส่งกลับสตริงที่จัดรูปแบบ #RRGGBB </code>
Scott Aron Bloom
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.