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

È stato utile?

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

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top