Я создаю QTableView с пользовательским QSortFilterProxyModel, приведенный ниже код является простейшим примером.
class SortFilterProxyModel(QSortFilterProxyModel):
def __init__(self, parent=None, dateCol=0):
super(QSortFilterProxyModel,self).__init__(parent)
self.filters = {}
def setFilterByColumn(self, regex, column):
self.filters[column] = regex
self.invalidateFilter()
def filterAcceptsRow(self, source_row, source_parent):
for key, regex in self.filters.items():
ix = self.sourceModel().index(source_row, key, source_parent)
if ix.isValid():
text = self.sourceModel().data(ix)
result=regex.pattern().split('|')
if not text in result:
return False
return True
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.model=QSqlTableModel(self)
self.model.setTable('table1')
self.model.setEditStrategy(QSqlTableModel.OnFieldChange)
self.model.select()
self.proxyModel=SortFilterProxyModel(self)
self.proxyModel.setSourceModel(self.model)
self.tableView=QTableView(self)
self.tableView.setModel(self.proxyModel)
self.proxyList=['term1','term2','term3']
self.proxyCol=3
self.proxyModel.setFilterByColumn(QRegExp('|'.join(self.proxyList), Qt.CaseInsensitive, QRegExp.RegExp),self.proxyCol)
self.proxyModel.sort(self.proxyCol, Qt.AscendingOrder)
Данные self.tableView можно отфильтровать, установив self.proxyList, и можно отсортировать, вызвав метод QSortFilterProxyModel.sort ().
Теперь в таблице будут показаны данные, чьи данные в 3-м столбце представляют собой строки «term1», «term2», «term3», а строки «term1» будут перечислены вверху.
Моя проблема в том, что когда я редактирую данные в таблице, например, меняю «term1» на «term4», тогда отредактированная строка будет скрыта, если я изменю «term1» на «term3», то эта строка будут перечислены в нижней части. То есть, когда данные изменились, прокси-сервер (ограничительное условие) будет повторно применен.
Есть ли способ заблокировать прокси при редактировании данных таблицы, как в Excel?