2012-01-24 34 views
5

que tienen una estructura de datos personalizada que quiero mostrar en una aplicación de PyQt utilizando un QTableView. Estoy usando una subclase de QAbstractTableModel para comunicarme con los datos. La estructura de datos en sí está en un módulo separado y no sabe nada sobre PyQt.Cómo actualizar QAbstractTableModel y QTableView después de la clasificación de la fuente de datos?

Visualización y edición de los datos con los que funciona el QTableView, pero ahora me gustaría ordenar los datos y luego actualizar el modelo y la vista.

Después de leer la documentación de Qt para QAbstractTableModel y su ancestro QAbstractItemModel, mi primer acercamiento era intentar esto:

class MyModel(QtCore.QAbstractTableModel): 
    __init__(self, data_structure): 
     super().__init__() 
     self.data_structure = data_structure 

    # ... 

    def sort_function(self): 
     self.layoutAboutToBeChanged.emit() 
     # custom_sort() is built into the data structure 
     self.data_structure.custom_sort() 
     self.layoutChanged.emit() 

Sin embargo, esto no funciona para actualizar la vista. También intenté emitir una señal DataChanged en todos los datos utilizados por el modelo, pero tampoco se pudo actualizar la vista.

hice una investigación ulterior. Si entiendo correctamente, el problema es que los QPersistentModelIndexes en el modelo no se actualizan, y la solución sería actualizarlos de alguna manera de forma manual.

¿Hay una mejor manera de hacer esto? Si no, ¿cómo voy a actualizarlos (preferiblemente sin tener que escribir una nueva función de clasificación que rastree todos los cambios de índice)?

+0

Tu código * debería * funcionar y * no deberías * preocuparte por los índices persistentes aquí. He escrito modelos que emiten las mismas señales que tu 'sort_function' y actualiza correctamente las vistas. ¿Estás seguro de que se llama a tu función, 'custom_sort()' realmente cambia los datos y estos cambios se reflejan en el método 'data()' de tu modelo? –

+0

@FerdinandBeyer Ahh, ese era el problema! Ya había verificado que los datos estaban siendo cambiados, pero no pensé en verificar el método data() en sí. custom_sort() estaba copiando algunos elementos donde necesitaba clasificarlos en su lugar. ¡Muchas gracias! –

+0

No hay problema. ¡Siéntase libre de publicar su solución como una respuesta, y acéptela, para que esta pregunta se marque como respondida! –

Respuesta

3

Hubo un error en la función Custom_Sort(). Después de arreglarlo, el enfoque que describí aquí funciona.

class MyModel(QtCore.QAbstractTableModel): 
    __init__(self, data_structure): 
     super().__init__() 
     self.data_structure = data_structure 

    # ... 

    def sort_function(self): 
     self.layoutAboutToBeChanged.emit() 
     # custom_sort() is built into the data structure 
     self.data_structure.custom_sort() 
     self.layoutChanged.emit() 
Cuestiones relacionadas