Un ListView di caselle di controllo in PyQt
-
21-08-2019 - |
Domanda
Voglio visualizzare un QListView dove ogni articolo è una casella di controllo con una certa etichetta. Le caselle di controllo dovrebbero essere visibili in ogni momento. Un modo mi viene in mente sta usando un delegato personalizzato e QAbstractListModel. Sono modi più semplici lì? Potete fornire il frammento di più semplice che fa questo?
Grazie in anticipo
Soluzione
Se state scrivendo un modello, basta includere il Qt.ItemIsUserCheckable
bandiera il valore restituito dal metodo flags()
, e garantire che si ritorni
un valore valido per il Qt.CheckStateRole
dal metodo data()
.
Se si utilizza la classe QStandardItemModel
, includere il setFlags()
Bandiera in coloro che si passa al metodo di ogni articolo setData()
, e si imposta il controllo
Stato per la <=> con il suo metodo <=>.
In una sessione interattiva di Python, digitare quanto segue:
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()
Altri suggerimenti
Ho finito per usare il metodo fornito da David Boddie nella mailing list PyQt. Ecco un frammento di lavoro basato sul suo codice:
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_()
Nota: cambiato il richiamo di setData
con un ruolo di controllo per setCheckState
e utilizzato setCheckable
invece di bandiere