Ein Listview von Kontrollkästchen in PyQt
-
21-08-2019 - |
Frage
Ich mag ein QListView anzuzeigen, in dem jedes Element eine Checkbox mit einigem Etikett ist. Die Kontrollkästchen sollte jederzeit sichtbar sein. Eine Möglichkeit, die ich denken kann ist mit einem benutzerdefinierten Delegaten und QAbstractListModel. Gibt es einfachere Wege? Können Sie die einfachste Schnipsel liefern, das dies tut?
Vielen Dank im Voraus
Lösung
Wenn Sie Ihr eigenes Modell schreiben, sind nur die Qt.ItemIsUserCheckable
Flag im Rückgabewert der flags()
Methode, und stellen Sie sicher, dass Sie zurückkehren
ein gültiger Wert für die Qt.CheckStateRole
vom data()
Verfahren.
Wenn Sie die QStandardItemModel
Klasse zu verwenden, schließen die Qt.ItemIsUserCheckable
Flagge in denen Sie jeden Einzelteil setFlags()
Methode übergeben, und stellen Sie den Scheck
Zustand für den Qt.CheckStateRole
mit seiner setData()
Methode.
In einer interaktiven Python-Sitzung, geben Sie wie folgt vor:
from PyQt4.QtGui import *
model = QStandardItemModel()
item = QStandardItem("Item")
item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
item.setData(QVariant(Qt.Checked), Qt.CheckStateRole)
model.appendRow(item)
view = QListView()
view.setModel(model)
view.show()
Andere Tipps
beenden ich von David Boddie in der PyQt Mailing-Liste zur Verfügung gestellt mit der Methode auf. Hier ist ein Arbeits Schnipsel basierend auf seinem Code:
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
from random import randint
app = QApplication(sys.argv)
model = QStandardItemModel()
for n in range(10):
item = QStandardItem('Item %s' % randint(1, 100))
check = Qt.Checked if randint(0, 1) == 1 else Qt.Unchecked
item.setCheckState(check)
item.setCheckable(True)
model.appendRow(item)
view = QListView()
view.setModel(model)
view.show()
app.exec_()
. Hinweis: Der Aufruf von setData
mit einem Scheck Rolle geändert setCheckState
statt Fahnen setCheckable
und verwendet