Как ускорить пользовательский QSortFilterProxyModel? - PullRequest
0 голосов
/ 10 июля 2019

У меня есть пользовательский 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

На стандартной модели, когда я набираю некоторый текст в поле фильтра, он фильтруется в мгновение ока, но когда я переключаюсь на пользовательскую модель, когда я печатаю, требуется время, чтобы даже показать в поле то, что я только что набрал , Это также становится все медленнее и медленнее с большим номером строки (от нескольких до десятков тысяч).

...