Un ListView de casillas de verificación en PyQt
-
21-08-2019 - |
Pregunta
Quiero mostrar un QListView donde cada elemento es una casilla de verificación con alguna etiqueta.Las casillas de verificación deben ser visibles en todo momento.Una forma en que puedo pensar es el uso de un delegado personalizado y QAbstractListModel.Hay maneras más simples?Puede usted proporcionar la más simple trozo de código que hace esto?
Gracias de antemano
Solución
Si usted está escribiendo su propio modelo, basta con incluir el Qt.ItemIsUserCheckable
bandera en el valor de retorno del método flags()
, y asegurarse de que regrese
un valor válido para el Qt.CheckStateRole
del método data()
.
Si se utiliza la clase QStandardItemModel
, incluya el setFlags()
bandera en los que se pasa al método de cada elemento setData()
, y se establece el cheque
Estado para la <=> con su método <=>.
En una sesión interactiva de Python, escriba lo siguiente:
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()
Otros consejos
Terminé usando el método proporcionado por David Boddie en el PyQt lista de correo.He aquí un trabajo fragmento de código basado en su código:
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:cambió la llamada de setData
con un cheque de papel setCheckState
y se utiliza setCheckable
en lugar de banderas.