2008-10-07 27 views
30

Tôi đang cố gắng đặt màu nền cho hộp xoay đôi và tôi không chắc chắn nên sử dụng chức năng nào.Làm cách nào để đặt màu nền của tiện ích con như hộp tổ hợp hoặc hộp xoay kép?

Tôi thấy một số chức năng được gọi là SetBackgroundRole chấp nhận Qt::ColorRole, nhưng tôi cũng không chắc chắn cách sử dụng tính năng này.

Vui lòng cho tôi biết, cách đơn giản để thay đổi màu nền của một số QComboBox hoặc QDoubleSpinBox là gì?

Trả lời

35

Sử dụng một QPalette không được bảo đảm để làm việc cho tất cả các phong cách, bởi vì tác giả phong cách bị hạn chế bởi chủ trương nền tảng khác nhau và bởi các công cụ chủ đề quê hương.

Để đảm bảo màu nền của bạn chính xác, tôi khuyên bạn nên sử dụng Qt Style Sheet. Dưới đây là những gì tôi đã làm để thay đổi màu nền của một QComboBox:

myComboBox->setStyleSheet("QComboBox { background-color: blue; }");

tôi đã không cố gắng đặc biệt cho một QSpinBox, nhưng tôi đoán nó sẽ làm việc như nhau!

+7

Sử dụng biểu định kiểu để đặt màu nền không phải là cách tiếp cận chính xác, trừ khi bạn sẵn sàng cũng tạo kiểu cho các điều khiển phụ khác trong QComboBox (nghĩa là thả xuống và mũi tên xuống). Xem lưu ý từ tài liệu Qt: "Với các tiện ích phức tạp như QComboBox và QScrollBar, nếu một thuộc tính hoặc điều khiển phụ được tùy chỉnh, tất cả các thuộc tính hoặc điều khiển phụ khác cũng phải được tùy chỉnh." Link: http://doc.trolltech.com/4.5/stylesheet-customizing.html – Krsna

0

Tôi muốn thử một cái gì đó giống như

QPalette pal = widget.palette(); 
pal.setColor(QPalette::Window, Qt::blue); 
widget.setPalette(pal); 
+1

Tôi đã cố gắng làm điều này, nhưng bằng cách nào đó màu nền là không nhận được cập nhật. Bất kỳ ý tưởng nào có thể là lý do. Có điều gì khác mà bạn đã giả định không .. – AMM

+0

Ý tôi là tôi nên gọi một thứ gì đó như sơn lại hay bất cứ thứ gì sau khi làm setPalette – AMM

+0

Tôi không có QT để kiểm tra ở đây, nhưng QWidget :: update() sẽ buộc phải sơn lại. Bạn đã thử giải pháp của Jérôme chưa? – fhe

40

fhe nói chung là đúng, nhưng không tính đến các tiện ích (như hộp xoay và nút/combobox) sử dụng vai trò nền khác trong bảng màu. Một giải pháp tổng quát hơn sẽ là một cái gì đó như thế này:

QPalette pal = widget.palette(); 
pal.setColor(widget.backgroundRole(), Qt::blue); 
widget.setPalette(pal); 

Ngoài ra, bạn có thể nhìn vào các mô tả trong những vai trò bảng khác nhau và tìm ra một trong những bạn muốn, sau đó áp dụng nó vào các widget chứa những người khác mà bạn muốn thay đổi . Các thay đổi của bảng màu sẽ lan truyền đến các tiện ích con.

1

Xây dựng một bảng màu đó là màu xanh không có vấn đề gì widget thực tế:

comboBox->setPalette(QPalette(Qt::blue)); 
11

Rõ ràng trong Qt 4.1 và trở đi, bạn cần phải thiết lập this->setAutoFillBackground(true); cho bảng để áp dụng màu nền.

+0

cảm ơn, điều này đã bị thiếu –

+0

điều này phải là một bình luận – brettmichaelgreen

10

Thực ra, nếu bạn xem tài liệu Qt cho QPalette trong trường hợp của QComboBox, vai trò nền có lẽ không phải là thứ bạn muốn. Những gì bạn muốn là:

QPalette :: Base Được sử dụng chủ yếu như màu nền cho các vật dụng nhập văn bản, nhưng cũng có thể được sử dụng cho bức tranh khác - chẳng hạn như là nền tảng của combobox thả xuống danh sách và xử lý thanh công cụ. Nó thường có màu trắng hoặc màu sáng khác.

Vì vậy, đây là mã tôi đang sử dụng để thiết lập màu nền của một combo box Tôi đang sử dụng để phù hợp với màu sắc của widget đó là ngày:

QPalette pal = myComboBox->palette(); 
pal.setColor(QPalette::Base, pal.color(QPalette::Window)); 
myComboBox->setPalette(pal); 
0
comboBox->setPalette(QPalette(Qt::blue)); 

trình tốt cho tôi!

+0

Tôi đã thử này, nhưng tôi chỉ hoạt động nếu QSpinBox bị vô hiệu hóa (tức là nếu QSpinBox được tráng men, màu trở lại bình thường). Bất kỳ ý tưởng? – ismailsunni

3

Trong khi các câu trả lời trước có thể đặt màu nền cho QComboBox không thể chỉnh sửa, chúng không hoạt động cho QComboBox có thể chỉnh sửa. Trong trường hợp đó, bạn cần lấy phụ tùng QLineEdit được sử dụng để chỉnh sửa và đặt lại nền của nó.

Dưới đây là cách tôi đã nhận nó để làm việc:

QComboBox *myComboBox = new QComboBox(); 
    myComboBox->setEditable(true); 
    QColor backColor = QColor(246, 230, 230); 
    QLineEdit *lineEditor = myComboBox->lineEdit(); 
    QPalette pal = lineEditor->palette(); 
    pal.setColor(QPalette::Base, backColor); 
    lineEditor->setPalette(pal); 
Các vấn đề liên quan