Данные поступают из 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 () работает правильно, но это не то, что я хотел.