Раньше я спрашивал a question
о фильтрации нескольких столбцов, которую нам нужно представляют строки, соответствующие более чем одному шаблону фильтра.
Теперь при работе с большими таблицами (под big
я подразумеваю около 200 000 строк и 4 столбца) фильтрация замедляется, если у нас такая большая таблица (обычно это хуже всего для первых двух символов шаблона фильтра).
Итак, что вы предлагаете по этому поводу?
Примечание. У меня есть собственная высокопроизводительная модель исходных данных (вместо QStandardItemModel
), основанная на примере this
. просмотреть это количество строк примерно за 1 секунду
Изменить 1
Изменение моего метода с этого:
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const {
if (/* filtering is enable*/) {
bool _res = sourceModel()->data(sourceModel()->index(source_row, 0, source_parent)).toString().contains( /*RegExp for column 0*/);
for (int col = 0; col < columnCount(); col++) {
_res &= sourceModel()->data(sourceModel()->index(source_row, col + 1, source_parent)).toString().contains(/*RegExp for column col + 1*/);
}
return _res;
}
return true;
}
К этому :
bool DataFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const {
if (_enable) {
return (sourceModel()->index(source_row, 0, source_parent.child(source_row, 0)).data().toString().contains( /*string for column 0*/ ))
&& sourceModel()->index(source_row, 1, source_parent.child(source_row, 1)).data().toString().contains(/*string for column 1*/))
&& sourceModel()->index(source_row, 2, source_parent.child(source_row, 2)).data().toString().contains(/*string for column 2*/))
&& sourceModel()->index(source_row, 3, source_parent.child(source_row, 3)).data().toString().contains(/*string for column 3*/));
}
return true;
}
Look работает отлично. Теперь фильтрация работает как часы без задержек
QSortFilterProxyModel
. Было бы неплохо реализовать фильтрацию внутри модели исходных данных (полученной изQAbstractTableModel
), если нам нужна только фильтрация? если нет, я прислушаюсь к вашей рекомендации. - person IMAN4K   schedule 14.10.2016&&
постарайтесь помочь ему быстро выйти из строя - сначала ставьте наименее вероятный случай. Это уменьшит количество вычислений последующих ветвей конъюнкции. - person Toby Speight   schedule 14.10.2016