Une liste image de cases à cocher dans PyQt
-
21-08-2019 - |
Question
Je veux afficher un QListView où chaque élément est une case à cocher avec une étiquette. Les cases doivent être visibles en tout temps. Une façon je peux penser utilise un délégué personnalisé et QAbstractListModel. Y at-il des moyens plus simples? Pouvez-vous fournir l'extrait le plus simple qui fait cela?
Merci d'avance
La solution
Si vous écrivez votre propre modèle, il suffit d'inclure le Qt.ItemIsUserCheckable
drapeau de la valeur de retour de la méthode flags()
, et assurez-vous que vous revenez
une valeur valide pour le Qt.CheckStateRole
de la méthode data()
.
Si vous utilisez la classe QStandardItemModel
, inclure le setFlags()
drapeau dans ceux que vous passez à la méthode de chaque élément setData()
et définissez le contrôle
Etat de la <=> avec sa méthode <=>.
Dans une session interactive Python, tapez ce qui suit:
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()
Autres conseils
Je fini par utiliser la méthode fournie par David Boddie dans la liste de diffusion PyQt. Voici un extrait de travail en fonction de son 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_()
Note: changé l'appel avec un rôle setData
de contrôle et utilisé pour setCheckState
au lieu de drapeaux setCheckable