Hallo zusammen,
ich würde gerne so etwas wie eine Liste mit Checkboxes erstellen. Die länge dieser Liste und die QCheckBox Objekte werden erst zur Laufzeit erstellt.
Was mir fehlt ist das passende Widget, welches (falls nötig) auch ne Scrollbar an der Seite anzeigt.
Ich habs mir QScrollArea versucht, bekomms aber nicht hin und QListWidget tuts schon garnicht.
Weiß jemand rat?
Checkboxes als Liste
QListWidget tut das sehr wohl, Du musst nur die Dokumentation lesen
Wenn Du Items hinzufügst, dann musst Du mit "setFlags()" dafür sorgen, dass das Widget das Item überhaupt als "checkable" erkennt. Welchen Flag Du setzen musst, kannst Du in der Dokumentation nachlesen oder dem folgenden Beispiel entnehmen. Anschließend kannst Du auch mit ".checkState()" oder ".setCheckState()" den Zustand der Checkbox abfragen bzw. verändern.
Die Alternative ist QListView mit einem eigenen Modell. Bei einem einfachen, von QStringListModel abgeleitetem Modell sieht das in etwa (ungetestet) so aus:
Dieses Modell kannst Du dann befüllen und einem QListView zuweisen.

Wenn Du Items hinzufügst, dann musst Du mit "setFlags()" dafür sorgen, dass das Widget das Item überhaupt als "checkable" erkennt. Welchen Flag Du setzen musst, kannst Du in der Dokumentation nachlesen oder dem folgenden Beispiel entnehmen. Anschließend kannst Du auch mit ".checkState()" oder ".setCheckState()" den Zustand der Checkbox abfragen bzw. verändern.
Die Alternative ist QListView mit einem eigenen Modell. Bei einem einfachen, von QStringListModel abgeleitetem Modell sieht das in etwa (ungetestet) so aus:
Code: Alles auswählen
class CheckableListModel(QStringListModel):
def __init__(self, parent=None):
QStringListModel.__init__(self, parent)
self._checked_rows = set()
def flags(self, index):
return QStringListModel.flags(self, index) | Qt.ItemIsUserCheckable
def data(self, index, role):
if role == Qt.CheckStateRole:
return Qt.Checked if index.row() in self._checked_rows else Qt.Unchecked
return QStringListModel.data(self, index, role)
def setData(self, index, value, role):
if role == Qt.CheckStateRole:
if value.toInt() == Qt.Checked:
self._checked_rows.add(index.row())
else:
self._checked_rows.discard(index.row())
return True
return QStringListModel.setData(self, index, value, role)
Lies halt meinen Beitrag, insbesondere die ersten zwei Absätze. Du musst das Model-View-Framework nicht nutzen. QListWidget funktioniert auch.