Pyqt5 QTableView не обновляется после удаления строки - PullRequest
0 голосов
/ 25 апреля 2020

Данные поступают из pandas DataFrame, затем я загружаю данные в QAbstractTableModel, для которого я специально создал класс (я называю его pandasQtModel)

Функция setData в QAbstractTableModel выглядит следующим образом

    def setData(self, index, value, role=QtCore.Qt.EditRole):
    try:
        if not index.isValid():
            return False
        if role != QtCore.Qt.EditRole:
            return False
        row = index.row()
        if row < 0 or row >= len(self._data.values):
            return False
        column = index.column()
        if column < 0 or column >= self._data.columns.size:
            return False
        self._data.iloc[index.row(), index.column()] = value
        self.dataChanged.emit(index, index)
        return True

Затем я создал QSortFilterProxyModel, используя QAbstractTableModel в качестве источника (потому что я хочу добавить фильтр):

        self.model = pandasQtModel(data)
        self.filter_proxy_model = QtCore.QSortFilterProxyModel()
        self.filter_proxy_model.setSourceModel(self.model)
        self.filter_proxy_model.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive)
        self.filter_proxy_model.setFilterKeyColumn(0)

        self.MainTable.setModel(self.filter_proxy_model)
        self.inputFilter.textChanged.connect(self.filter_proxy_model.setFilterRegExp)

Здесь идет основной ди sh, я подключаю QPushButton к функция delete_rows (), но QTableView (self.MainTable) вообще не обновляется.

    def delete_rows(self):
    try:
        index_list = []
        for model_index in self.MainTable.selectionModel().selectedRows():
            index = QtCore.QPersistentModelIndex(model_index)
            index_list.append(index)

        print(f'Before delete_rows():\tself.df.shape(): {self.df.shape}')
        for index in index_list:
            self.MainTable.model().layoutAboutToBeChanged.emit()
            self.MainTable.model().removeRow(index.row())
            self.MainTable.model().layoutChanged.emit()
            self.df = self.df.drop([int(index.row())], axis=0)
            # Since QTableView has no "delete row" function, hideRow() is used
            # self.MainTable.hideRow(int(index.row()))
        print(f'After delete_rows():\tself.df.shape(): {self.df.shape}')
        return

Я погуглил и узнал, что layoutAboutToBeChanged должен быть вызван для запуска обновления TableView, но не кажется работать. hideRow () работает правильно, но это не то, что я хотел.

...