2014-04-05 15 views
5

È possibile creare prima una voce ComboBox, quindi impostare le sue proprietà di visualizzazione (come colore di sfondo, icona, colore del carattere, dimensione del carattere, ecc. E solo per aggiungerla a ComboBox usando il metodo di Comobobox .addItem() come è ora mi sono bloccato utilizzando:?.PyQt: Come personalizzare la visualizzazione degli elementi ComboBox

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

Inutile dire che questo approccio lascia poco spazio per la personalizzazione degli elementi del singolo ComboBox visualizzare le proprietà Quello che vorrei è qualcosa di simile :

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

Modificato dopo

Ecco un esempio funzionante degli articoli personalizzati di QCombobox. Grazie 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() 

risposta

7

Per impostazione predefinita, QComboBox utilizza un QStandardItemModel, quindi i metodi QStandardItem può essere utilizzato per modificare le varie proprietà di visualizzazione:

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:

Se si desidera per resettare uno degli item properties, impostarlo su None, come questo :

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

In perfetto orario! Grazie mille! – alphanumeric

+0

Come si ripristina il colore di primo piano di un oggetto su un valore predefinito "nessun colore"? ... dopo che l'elemento era già impostato item.setForeground (QtGui.QColor ('red')) è necessario passare dalla visualizzazione del colore a quella predefinita e viceversa ... – alphanumeric

+0

@Sputnix. Vedi la mia risposta aggiornata. Inoltre: ho appena realizzato che 'QComboBox' utilizza già un' QStandardItemModel', quindi ho semplificato il mio esempio di conseguenza. – ekhumoro

Problemi correlati