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

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top