From ddcf0df7d70b6bf7766c1fac2e6831c2077513e9 Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Fri, 13 Sep 2019 22:33:50 +0200 Subject: Speed up QSortFilterProxyModel filtering Speed up the QSortFilterProxyModel filtering by only updating the source_to_proxy entries which are really changed - When proxy intervals are added or removed, it is not needed to update the proxy_to_source indexes which were not touched. Change-Id: I35459ff1b04f4610ec74f4b01d58a71832a9ae22 Reviewed-by: David Faure --- src/corelib/itemmodels/qsortfilterproxymodel.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'src/corelib/itemmodels') diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.cpp b/src/corelib/itemmodels/qsortfilterproxymodel.cpp index a620e25f13..6ed4c942d8 100644 --- a/src/corelib/itemmodels/qsortfilterproxymodel.cpp +++ b/src/corelib/itemmodels/qsortfilterproxymodel.cpp @@ -403,8 +403,8 @@ public: QVector &source_to_proxy, QVector &proxy_to_source, int proxy_start, int proxy_end, const QModelIndex &proxy_parent, Qt::Orientation orient, bool emit_signal = true); - void build_source_to_proxy_mapping( - const QVector &proxy_to_source, QVector &source_to_proxy) const; + static inline void build_source_to_proxy_mapping( + const QVector &proxy_to_source, QVector &source_to_proxy, int start = 0); void source_items_inserted(const QModelIndex &source_parent, int start, int end, Qt::Orientation orient); void source_items_about_to_be_removed(const QModelIndex &source_parent, @@ -798,9 +798,11 @@ void QSortFilterProxyModelPrivate::remove_proxy_interval( } // Remove items from proxy-to-source mapping + for (int i = proxy_start; i <= proxy_end; ++i) + source_to_proxy[proxy_to_source.at(i)] = -1; proxy_to_source.remove(proxy_start, proxy_end - proxy_start + 1); - build_source_to_proxy_mapping(proxy_to_source, source_to_proxy); + build_source_to_proxy_mapping(proxy_to_source, source_to_proxy, proxy_start); if (emit_signal) { if (orient == Qt::Vertical) @@ -926,7 +928,7 @@ void QSortFilterProxyModelPrivate::insert_source_items( for (int i = 0; i < source_items.size(); ++i) proxy_to_source.insert(proxy_start + i, source_items.at(i)); - build_source_to_proxy_mapping(proxy_to_source, source_to_proxy); + build_source_to_proxy_mapping(proxy_to_source, source_to_proxy, proxy_start); if (emit_signal) { if (orient == Qt::Vertical) @@ -1208,11 +1210,12 @@ void QSortFilterProxyModelPrivate::proxy_item_range( \internal */ void QSortFilterProxyModelPrivate::build_source_to_proxy_mapping( - const QVector &proxy_to_source, QVector &source_to_proxy) const + const QVector &proxy_to_source, QVector &source_to_proxy, int start) { - source_to_proxy.fill(-1); - int proxy_count = proxy_to_source.size(); - for (int i = 0; i < proxy_count; ++i) + if (start == 0) + source_to_proxy.fill(-1); + const int proxy_count = proxy_to_source.size(); + for (int i = start; i < proxy_count; ++i) source_to_proxy[proxy_to_source.at(i)] = i; } -- cgit v1.2.3