diff options
author | Marc Mutz <marc.mutz@qt.io> | 2024-01-12 08:02:07 +0100 |
---|---|---|
committer | Marc Mutz <marc.mutz@qt.io> | 2024-01-15 13:28:31 +0000 |
commit | edff6a33a1e3757b9bb4831091a3db8fa99e3219 (patch) | |
tree | 5c0388112fe6c737ab12e25351be5add25946353 /src/corelib/kernel | |
parent | b909b8dfe808ed6bbb9f4353729c8810ee0e95c7 (diff) |
QObject: de-pessimize installEventFilter()
Don't loop over the list of event filters twice, do it once with a
combined predicate.
This code is still has a big impedance mismatch: the removeIf() will
always leave empty space at the back while prepend() needs it at the
front. We should fix this by reversing the meaning of the order of
event filters to mean back()-is-applied-first, so new filters can be
append()ed, but that is for another patch.
Done-with: Jarek Kobus <jaroslaw.kobus@qt.io>
Pick-to: 6.7
Change-Id: I08324697229a54c8f66c6c320cf7232d707a08f1
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r-- | src/corelib/kernel/qobject.cpp | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index c36ae85e8a..0de572756b 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -2352,9 +2352,9 @@ void QObject::installEventFilter(QObject *obj) d->ensureExtraData(); - // clean up unused items in the list - d->extraData->eventFilters.removeAll((QObject *)nullptr); - d->extraData->eventFilters.removeAll(obj); + // clean up unused items in the list along the way: + auto isNullOrEquals = [](auto obj) { return [obj](const auto &p) { return !p || p == obj; }; }; + d->extraData->eventFilters.removeIf(isNullOrEquals(obj)); d->extraData->eventFilters.prepend(obj); } |