Python PyQT4: agregar un número desconocido de widgets QComboBox a QGridLayout
Pregunta
Quiero recuperar una lista de los nombres de las personas de una cola y, para cada persona, colocar una casilla de verificación con su nombre en un QGridLayout utilizando la función addWidget (). Puedo colocar con éxito los elementos en un QListView, pero simplemente escriben uno encima del otro en lugar de crear una nueva fila. ¿Alguien tiene alguna idea sobre cómo podría solucionar esto?
self.chk_People = QtGui.QListView()
items = self.jobQueue.getPeopleOffQueue()
for item in items:
QtGui.QCheckBox('%s' % item, self.chk_People)
self.jobQueue.getPeopleOffQueue () devolvería algo como ['Bob', 'Sally', 'Jimmy'] si eso ayuda.
Solución
Esta línea:
QtGui.QCheckBox('%s' % item, self.chk_People)
No agrega la casilla de verificación a la vista de lista, solo la crea con la vista de lista como principal, y hay una gran diferencia.
La forma más sencilla de usar una vista de lista es la clase de conveniencia QListWidget
. Para eso, cree sus casillas de verificación como instancias de QListWidgetItem
y luego use addItem
en el widget de la lista para agregarlas realmente.
¿Tuvo problemas para agregarlos a un diseño de cuadrícula? Por lo general, si la cantidad de casillas de verificación que tiene es pequeña, un diseño de cuadrícula podría ser mejor; todo depende de cómo desee que se vea su aplicación. Pero si puede tener muchos de estos objetos, entonces un widget / vista de lista es lo mejor.
Otros consejos
No puedo decirle la solución en PyQt, pero la estructura que debe seguir es la siguiente. QListView puede hacer lo que necesita, no necesita crear casillas de verificación separadas. Cree una subclase de QAbstractItemModel
o QStandardItemModel
(dependiendo de la cantidad de codificación que desee hacer) anule el < code> flags () método para devolver las banderas apropiadas incluyendo Qt :: ItemIsUserCheckable
, en el método columncount ()
agregue una columna adicional para incluir la casilla de verificación y en el data
método para la columna donde desea que aparezca su casilla de verificación devolver el estado marcado Qt :: Checked
, Qt :: Unchecked
para el Qt :: CheckStateRole
.
Esto también se puede lograr utilizando el QListWidget
donde puede usar QListWidgetItem
para agregar datos y no Necesito crear un modelo. En QListWidgetItem
puede usar setFlags ()
y setData (QVariant (bool, Qt :: CheckStateRole)
sin tener que subclasificar un modelo