Python PyQT4 - Aggiunta di un numero sconosciuto di widget QComboBox a QGridLayout
Domanda
Voglio recuperare un elenco di nomi di persone da una coda e, per ogni persona, posizionare una casella di controllo con il loro nome in un QGridLayout usando la funzione addWidget (). Posso posizionare correttamente gli elementi in un QListView, ma si limitano a scrivere uno sopra l'altro anziché creare una nuova riga. Qualcuno ha qualche idea su come potrei risolvere questo problema?
self.chk_People = QtGui.QListView()
items = self.jobQueue.getPeopleOffQueue()
for item in items:
QtGui.QCheckBox('%s' % item, self.chk_People)
self.jobQueue.getPeopleOffQueue () restituirebbe qualcosa del tipo ['Bob', 'Sally', 'Jimmy'] se questo aiuta.
Soluzione
Questa riga:
QtGui.QCheckBox('%s' % item, self.chk_People)
Non aggiunge la casella di controllo alla vista elenco, la crea solo con la vista elenco come genitore e c'è una grande differenza.
Il modo più semplice di utilizzare una vista elenco è la classe di convenienza QListWidget
. Per questo, crea le tue caselle di controllo come istanze di QListWidgetItem
e quindi usa addItem
sul widget elenco per aggiungerle realmente ad esso.
Hai avuto problemi ad aggiungerli a un layout di griglia? Di solito, se la quantità di caselle di controllo che hai è piccola, un layout di griglia potrebbe essere migliore - tutto dipende da come vuoi che app appaia. Ma se potresti avere molti di questi oggetti, allora un widget / vista elenco è il migliore.
Altri suggerimenti
Non posso dirti la soluzione in PyQt ma la struttura che devi seguire è la seguente. QListView può fare ciò di cui hai bisogno, non è necessario creare caselle di controllo separate. Crea una sottoclasse di QAbstractItemModel
o QStandardItemModel
(a seconda di quanta codifica vorrai fare) sovrascrivi < codice> flags () per restituire i flag appropriati compreso Qt :: ItemIsUserCheckable
, nel metodo columncount ()
aggiungi una colonna aggiuntiva per includere la casella di controllo e nei dati
per la colonna in cui vuoi che appaia la tua casella di controllo restituisce lo stato controllato Qt :: Checked
, Qt :: Unchecked
per Qt :: CheckStateRole
.
Ciò può essere realizzato anche utilizzando QListWidget
dove è possibile utilizzare QListWidgetItem
per aggiungere dati e non bisogno di creare un modello. Su QListWidgetItem
puoi usare setFlags ()
e setData (QVariant (bool, Qt :: CheckStateRole)
senza dover sottoclassare un modello