2014-04-05 35 views
5

Önce bir ComboBox öğesi oluşturmak mümkün mü, daha sonra görüntü özelliklerini (öğenin arka plan rengi, simge, yazı tipi rengi, yazı tipi boyutu vb. Gibi) ve sonra ComboBox'a eklemek için .PyQt: ComboBox Öğeleri nasıl özelleştirilir?

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

bu yaklaşım bireysel ComboBox'ın ürün özelliklerini görüntülemek özelleştirme için az yer bırakır söylemeye gerek yok ne istiyorum böyle bir şeydir:? şimdi olduğu kullanıyorum şaşırıp gibi Comobobox en .addItem() yöntemini kullanarak :

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

Daha sonra düzenlendi

İşte QCombobox'ın özelleştirilmiş öğelerinin çalışan bir örneğidir. Teşekkürler Ekhumoro!


Varsayılan olarak
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() 

cevap

7

, QComboBox bir QStandardItemModel kullanır, bu nedenle QStandardItem yöntemleri çeşitli görüntü özelliklerini değiştirmek için kullanılabilir:

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:

İsterseniz item properties'dan birini sıfırlamak için, bunu None olarak ayarlayın. :

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

Tam zamanında! Çok teşekkür ederim! – alphanumeric

+0

Bir öğenin ön plan rengini varsayılan olarak "renk yok" durumuna nasıl sıfırlarız? ... öğeyi zaten item.setForeground (QtGui.QColor ('kırmızı') olarak ayarladıktan sonra ekranını varsayılandan renkli ve tersine çevirmeye ihtiyaç var ... – alphanumeric

+0

@Sputnix. Güncellenmiş cevabımı görün. Ayrıca: "QComboBox" un zaten bir "QStandardItemModel" kullandığını fark ettim, dolayısıyla örneğimi buna göre basitleştirdim. – ekhumoro