2014-04-05 21 views
5

Ist es möglich, zuerst ein ComboBox-Element zu erstellen, dann seine Anzeigeeigenschaften (z. B. Hintergrundfarbe, Symbol, Schriftfarbe, Schriftgröße usw.) festzulegen und erst dann ComboBox hinzuzufügen mit Comobobox der .addItem() Methode So wie es jetzt ist, ich bin mit fest:?.PyQt: Wie man ComboBox Items anpassen

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

Unnötig dieser Ansatz für die Anpassung der einzelnen ComboBox wenig Raum zu sagen, lässt Elemente Eigenschaften anzeigen Was würde ich mag so etwas wie dieses :

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

Später bearbeitet

Hier ist ein Arbeitsbeispiel von QCombobox's kundenspezifischen Artikeln. Danke 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() 

Antwort

7

verwendet standardmäßig QComboBox eine QStandardItemModel, so dass die QStandardItem Methoden verwendet werden können, um die verschiedenen Anzeigeeigenschaften zu ändern:

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:

Wenn Sie möchten, Um einen der item properties zurückzusetzen, setzen Sie ihn wie folgt auf None :

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

Pünktlich! Vielen Dank! – alphanumeric

+0

Wie setzen wir die Vordergrundfarbe eines Objekts auf die Standardfarbe "keine Farbe" zurück? ... nachdem das Element bereits item.setForeground (QtGui.QColor ('red')) gesetzt wurde, muss die Anzeige von Farbe auf Standard umgeschaltet werden und umgekehrt ... – alphanumeric

+0

@Sputnix. Siehe meine aktualisierte Antwort. Außerdem: Ich habe gerade festgestellt, dass 'QComboBox' bereits ein' QStandardItemModel' verwendet, also habe ich mein Beispiel entsprechend vereinfacht. – ekhumoro