У меня есть пользовательский QSortFilterProxyModel, который позволяет фильтровать все столбцы, кроме указанных в списке, которые можно установить с помощью функции. Я переопределяю filterAcceptsRow () функцию для выборки строк с шаблоном фильтра. Все работает нормально, фильтрует правильно, как я хотел, но в пользовательской модели требуется больше времени, чем в стандартной модели.
Я пробовал только два разных подхода, чтобы сопоставить данные модели с шаблоном фильтра (как прокомментировано в коде ниже), но оба они медленнее, чем при использовании стандартной модели. Я также попытался изменить тип данных, полученных из модельного индекса, на QString, как в оригинальном методе стандартной модели:
https://dreamswork.github.io/qt4/classQSortFilterProxyModel.html#acb9addede0e557d21031132712bd0528
но есть общая проблема преобразования питонической строки / юникода в тип данных QString.
Я использую Python в версии 2.7 и PyQt4 - пока нет возможности использовать более высокую версию Python / PyQt.
class MultiColsSortFilterProxyModel(QtGui.QSortFilterProxyModel):
"""
Custom QSortFilterProxyModel with possibility to
disable given columns from model filtering
"""
def __init__(self, parent=None):
super(MultiColsSortFilterProxyModel, self).__init__(parent)
self.ex_cols = []
def set_excluded_cols(self, ex_cols):
"""
Sets list with columns indexes that will be excluded
from model filtering
:param ex_cols: List<int> list of columns to exclude
"""
self.ex_cols = ex_cols
def excluded_cols(self):
"""
Gets columns indexes excluded from model filtering
:return: List<int>
"""
return self.ex_col
def filterAcceptsRow(self, source_row, source_parent):
"""
Reimplemented from QSortFilterProxyModel.filterAcceptsRow()
Works almost the same, but exclude setted columns from filtering
"""
pattern = self.filterRegExp().pattern()
if self.filterRegExp().isEmpty():
return True
if self.filterKeyColumn() == -1:
col_count = self.sourceModel().columnCount()
for col in xrange(col_count):
if col not in self.ex_cols:
index = self.sourceModel().index(source_row, col, source_parent)
value = unicode(self.sourceModel().data(index))
# if self.filterRegExp().indexIn(value) >= 0:
if value.__contains__(pattern):
return True
return False
index = self.sourceModel().index(source_row, self.filterKeyColumn(), source_parent)
if not index.isValid():
return True
value = unicode(self.sourceModel().data(index))
return value.__contains__(pattern)
# return self.filterRegExp().indexIn(value) >= 0
На стандартной модели, когда я набираю некоторый текст в поле фильтра, он фильтруется в мгновение ока, но когда я переключаюсь на пользовательскую модель, когда я печатаю, требуется время, чтобы даже показать в поле то, что я только что набрал , Это также становится все медленнее и медленнее с большим номером строки (от нескольких до десятков тысяч).