2009-05-11 15 views
9

Quiero mostrar un QListView donde cada elemento es una casilla con alguna etiqueta. Las casillas de verificación deben estar visibles en todo momento. Una forma en que puedo pensar es usar un delegado personalizado y QAbstractListModel. ¿Hay formas más simples? ¿Puedes proporcionar el fragmento más simple que hace esto?A ListView de casillas de verificación en PyQt

Gracias de antemano

Respuesta

10

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, incluyen la bandera Qt.ItemIsUserCheckable en los que se pasa al método de cada elemento setFlags(), y establezca el estado de comprobación para la Qt.CheckStateRole con su método setData().

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

Terminé usando el método proporcionado por David Boddie en la lista de correo PyQt. He aquí un fragmento de trabajo 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: se ha cambiado el llamado de setData con una función de verificación para setCheckState y se utiliza setCheckable en lugar de banderas.

+1

¿Qué señales (si las hay) se emiten cuando dicho elemento/casilla de verificación está desactivado? – marcin

+3

para responderme, se puede usar 'model.itemChanged', como se muestra aquí: http://www.pythoncentral.io/pyside-pyqt-tutorial-qlistview-and-qstandarditemmodel/ – marcin

Cuestiones relacionadas