Python PyQT4 - Hinzufügen einer unbekannten Anzahl von QComboBox Widgets QGridLayout
Frage
Ich möchte eine Liste von Menschen, die Namen aus einer Warteschlange und für jede Person, abzurufen, legen Sie eine Checkbox mit ihrem Namen zu einem QGridLayout die addWidget () Funktion. Ich kann erfolgreich die Einzelteile in QListView platzieren, aber sie schreiben Sie einfach über den den jeweils anderen, anstatt eine neue Zeile zu erzeugen. Hat jemand irgendwelche Gedanken darüber, wie ich dieses Problem beheben könnte?
self.chk_People = QtGui.QListView()
items = self.jobQueue.getPeopleOffQueue()
for item in items:
QtGui.QCheckBox('%s' % item, self.chk_People)
self.jobQueue.getPeopleOffQueue () zurückkehren würde so etwas wie [ 'Bob', 'Sally', 'Jimmy'], ob das hilft.
Lösung
Diese Zeile:
QtGui.QCheckBox('%s' % item, self.chk_People)
Ist das Kontrollkästchen in die Listenansicht nicht hinzufügen, schafft es nur mit der Listenansicht als Mutter, und es gibt einen großen Unterschied.
Der einfachste Weg, eine Listenansicht zu verwenden, ist die QListWidget
Komfort-Klasse. Dazu Ihre Kontrollkästchen als Instanzen von QListWidgetItem
zu erstellen und dann addItem
auf der Liste Widget verwenden, um sie wirklich, um es hinzuzufügen.
Haben Sie ein Problem, sie zu einem Raster-Layout hinzuzufügen? Normalerweise, wenn die Menge von Kontrollkästchen Sie haben klein ist ein Raster-Layout besser sein könnte - es hängt alles davon ab, wie Sie möchten, dass Ihre App zu suchen. Aber wenn Sie könnten eine Menge solcher Objekte haben, dann eine Liste Widget / Ansicht ist die beste.
Andere Tipps
Ich kann Ihnen nicht die Lösung in PyQt sagen, aber die Struktur, die Sie folgen müssen, ist die folgende. Die QListView kann tun, was Sie brauchen, Sie brauchen keine separaten Kontrollkästchen zu erstellen. Erstellen Sie eine Unterklasse von QAbstractItemModel
oder QStandardItemModel
(je nachdem, wie viel Codierung Sie tun wollen) überschreiben die flags()
Methode zurückkehren, um die entsprechenden Flags mit Qt::ItemIsUserCheckable
im columncount()
Verfahren eine zusätzliche Spalte hinzuzufügen, das Kontrollkästchen enthalten und in der data
Verfahren für die Spalte, wo Sie Ihre Kontrollkästchen angezeigt werden soll zurückkehren den Überprüfungsstatus Qt::Checked
, Qt::Unchecked
für die Qt::CheckStateRole
.
Dies kann auch erreicht werden, indem die QListWidget
, wo Sie QListWidgetItem
Hinzufügen von Daten und müssen nicht um ein Modell zu erstellen. Auf QListWidgetItem
können Sie setFlags()
und setData(QVariant(bool, Qt::CheckStateRole)
ohne Unterklasse ein Modell