python - ¿Cómo actualizar QAbstractTableModel y QTableView después de ordenar la fuente de datos?
sorting pyqt (1)
Tengo una estructura de datos personalizada que quiero mostrar en una aplicación PyQt usando 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.
Mostrar y editar los datos con QTableView funciona, 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 enfoque fue probar 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 actualiza 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 algunas investigaciones adicionales. 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.
¿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)?
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()