2014-04-05 16 views
5

Có thể tạo mục ComboBox trước, sau đó đặt thuộc tính hiển thị (như màu nền, biểu tượng, màu phông chữ, kích thước phông chữ và vv và chỉ sau đó thêm nó vào ComboBox sử dụng phương pháp Comobobox của .addItem() vì nó là bây giờ tôi đang mắc kẹt sử dụng:?.PyQt: Làm thế nào để tùy chỉnh mục ComboBox hiển thị

myCombobox = QtGui.QComboBox 
for i in range(10): 
    myCombobox.addItem(str(i)) 

Không cần phải nói phương pháp này để lại rất ít không gian cho tùy biến các mặt hàng ComboBox cá nhân hiển thị thuộc tính những gì tôi muốn là một cái gì đó như thế này :

myCombobox = QtGui.QComboBox 
for i in range(10): 
    item = comboboxItem() 
    item.setColor(allBlueAndShiny) 
    font = QtGui.QFont() 
    font.setPointSize(10) 
    item.setFont(font) 

    # Only after item was set with all display properties it is added:   
    myCombobox.addItem(str(i)) 

Chỉnh sửa sau

Đây là một ví dụ làm việc về các mục tùy chỉnh của QCombobox. Cảm ơn Ekhumoro!


from PyQt4 import QtGui, QtCore 

def main(): 
    app = QtGui.QApplication(sys.argv) 
    window = QtGui.QWidget() 
    main_layout = QtGui.QVBoxLayout() 
    # QComboBox 
    combo = QtGui.QComboBox() 
    model = combo.model() 
    for row in range(10): 
     item = QtGui.QStandardItem(str(row)) 
     item.setForeground(QtGui.QColor('red')) 
     font = item.font() 
     font.setPointSize(10) 
     item.setFont(font) 
     model.appendRow(item) 
    main_layout.addWidget(combo) 

    ok_button = QtGui.QPushButton("OK") 
    ok_button.clicked.connect(OK)  
    main_layout.addWidget(ok_button) 

    main_layout.addStretch(1) 
    window.setLayout(main_layout) 
    window.show() 
    sys.exit(app.exec_()) 

def OK(self): 
    print 'OK' 

if __name__ == '__main__': 
    main() 

Trả lời

7

Theo mặc định, QComboBox sử dụng một QStandardItemModel, vì vậy QStandardItem phương pháp có thể được sử dụng để thay đổi các thuộc tính hiển thị khác nhau:

combo = QtGui.ComboBox() 
model = combo.model() 
for row in range(10): 
    item = QtGui.QStandardItem(str(index)) 
    item.setForeground(QtGui.QColor('red')) 
    font = item.font() 
    font.setPointSize(10) 
    item.setFont(font) 
    model.appendRow(item) 

PS:

Nếu bạn muốn để đặt lại một trong số item properties, đặt thành None, như thế này :

item = self.combo.model().item(row) 
    item.setData(None, QtCore.Qt.ForegroundRole) 
+0

Đúng giờ! Cảm ơn nhiều! – alphanumeric

+0

Làm cách nào để đặt lại màu nền trước của mặt hàng thành mặc định "không có màu"? ... sau khi mục đã được thiết lập item.setForeground (QtGui.QColor ('đỏ')) có một nhu cầu để chuyển đổi màn hình của nó từ màu sắc sang mặc định và ngược lại ... – alphanumeric

+0

@Sputnix. Xem câu trả lời cập nhật của tôi. Ngoài ra: Tôi vừa nhận ra rằng 'QComboBox' đã sử dụng một 'QStandardItemModel', vì vậy tôi đã đơn giản hóa ví dụ của tôi cho phù hợp. – ekhumoro

Các vấn đề liên quan