2009-05-11 15 views
9

Ich möchte eine QListView wo jedes Element ein Kontrollkästchen mit einem Label ist. Die Kontrollkästchen sollten immer sichtbar sein. Eine Möglichkeit, die mir einfällt, ist die Verwendung eines benutzerdefinierten Delegaten und von QAbstractListModel. Gibt es einfachere Wege? Können Sie das einfachste Snippet bereitstellen, das dies tut?Eine ListView von Checkboxen in PyQt

Vielen Dank im Voraus

Antwort

10

Wenn Sie Ihr eigenes Modell schreiben, sind nur die Qt.ItemIsUserCheckable Flag im Rückgabewert der flags() Methode, und stellen Sie sicher, dass Sie einen gültigen Wert für die Qt.CheckStateRole aus der data() Methode zurückgeben .

Wenn Sie die QStandardItemModel Klasse zu verwenden, schließen die Qt.ItemIsUserCheckable Flagge in denen Sie zu jedem setFlags() Stück Methode übergeben und für die Qt.CheckStateRole mit seiner setData() Methode den Kontroll Zustand gesetzt.

In einer interaktiven Python-Sitzung des folgenden:

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

I endete mit David Boddie in der PyQt Mailing-Liste zur Verfügung gestellt mit der Methode auf. Hier ist ein Arbeits Schnipsel basierend auf seinen 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: änderte den Aufruf von setData mit einem Scheck Rolle setCheckState und verwendet setCheckable statt Fahnen.

+1

Welche Signale (falls vorhanden) werden ausgegeben, wenn ein solches Element/Kontrollkästchen umgeschaltet wird? – marcin

+3

um mich selbst zu beantworten, kann 'model.itemChanged' verwendet werden, wie hier gezeigt: http://www.pythoncentral.io/pyside-pyqt-tutorial-qlistview-and-qstandarditemodel/ – marcin