2014-04-05 29 views
5

Czy można najpierw utworzyć element ComboBox, a następnie ustawić jego właściwości wyświetlania (takie jak kolor tła elementu, ikona, kolor czcionki, rozmiar czcionki itp. I tylko wtedy, aby dodać go do ComboBox stosując metodę Comobobox za .addItem() jak to jest teraz siedzę przy użyciu:.PyQt: Dostosowywanie wyświetlania elementów ComboBox

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

trzeba powiedzieć, że to podejście pozostawia niewiele miejsca na dostosowanie pozycji indywidualnych ComboBox jest wyświetlanie właściwości Chciałbym coś takiego :

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

Edytowane później

Oto działający przykład niestandardowych elementów QCombobox. Dzięki 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() 

Odpowiedz

7

Domyślnie QComboBox używa QStandardItemModel, więc metody QStandardItem może być wykorzystana do zmiany różnych właściwości wyświetlania:

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:

Jeśli chcesz aby zresetować jeden z item properties, ustaw go na None, jak to :

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

Zaraz na czas! Dziękuję Ci bardzo! – alphanumeric

+0

Jak zresetować kolor pierwszego planu elementu do domyślnego "bez koloru"? ... po ustawieniu elementu item.setForeground (QtGui.QColor ('czerwony')) należy zmienić jego wyświetlacz z kolorowego na domyślny i vice versa ... – alphanumeric

+0

@Sputnix. Zobacz moją zaktualizowaną odpowiedź. Ponadto: Właśnie zdałem sobie sprawę, że 'QComboBox' już używa' QStandardItemModel', więc uprościłem mój przykład. – ekhumoro

Powiązane problemy