2009-05-11 40 views
9

Je veux afficher un QListView où chaque élément est une case à cocher avec une étiquette. Les cases à cocher doivent être visibles à tout moment. Une façon que je peux penser est d'utiliser un délégué personnalisé et QAbstractListModel. Y a-t-il des moyens plus simples? Pouvez-vous fournir l'extrait le plus simple qui fait cela?A ListView des cases à cocher dans PyQt

Merci à l'avance

Répondre

10

Si vous écrivez votre propre modèle, il suffit d'inclure le drapeau Qt.ItemIsUserCheckable la valeur de retour de la méthode flags() et assurez-vous que vous revenez une valeur valide pour la Qt.CheckStateRole de la méthode data() .

Si vous utilisez la classe QStandardItemModel, comprennent le Qt.ItemIsUserCheckable drapeau dans ceux que vous passez à la méthode setFlags() de chaque élément, et définissez le contrôle état pour la Qt.CheckStateRole avec sa méthode setData().

Dans une session interactive Python, tapez:

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() 
21

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 de setData avec un rôle de chèque à setCheckState et utilisé setCheckable au lieu de drapeaux.

+1

Quels signaux (le cas échéant) sont émis lorsque cet élément/cette case à cocher est activé? – marcin

+3

pour me répondre, 'model.itemChanged' peut être utilisé, comme indiqué ici: http://www.pythoncentral.io/pyside-pyqt-tutorial-qlistview-and-qstandarditemmodel/ – marcin