Как обновить QAbstractTableModel и QTableView после сортировки источника данных? - PullRequest
4 голосов
/ 24 января 2012

У меня есть пользовательская структура данных, которую я хочу отобразить в приложении PyQt, используя QTableView. Я использую подкласс QAbstractTableModel для связи с данными. Сама структура данных находится в отдельном модуле и ничего не знает о PyQt.

Отображение и редактирование данных с помощью QTableView работает, но теперь я хотел бы отсортировать данные, а затем обновить модель и представление.

После прочтения документации Qt для QAbstractTableModel и его предка QAbstractItemModel, мой первый подход состоял в том, чтобы попробовать это:

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

Однако, это не может обновить представление. Я также пытался подать сигнал dataChanged на все данные, используемые моделью, но при этом также не удалось обновить представление.

Я провел дополнительное исследование. Если я правильно понимаю, проблема в том, что QPersistentModelIndexes в модели не обновляются, и решением было бы как-то вручную обновить их.

Есть ли лучший способ сделать это? Если нет, то как мне их обновить (желательно без необходимости писать новую функцию сортировки, которая отслеживает каждое изменение индекса)?

1 Ответ

4 голосов
/ 25 января 2012

В функции custom_sort () произошла ошибка. После исправления описанный мною подход работает.

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