diff --git a/src/quick/util/qquickdeliveryagent.cpp b/src/quick/util/qquickdeliveryagent.cpp index 0ff4f763fc..0c734b1521 100644 --- a/src/quick/util/qquickdeliveryagent.cpp +++ b/src/quick/util/qquickdeliveryagent.cpp @@ -2077,7 +2077,7 @@ void QQuickDeliveryAgentPrivate::deliverPointerEvent(QPointerEvent *event) */ // FIXME: should this be iterative instead of recursive? QVector QQuickDeliveryAgentPrivate::eventTargets(QQuickItem *item, const QEvent *event, QPointF scenePos, - std::function(QQuickItem *item, const QEvent *event)> predicate) const + qxp::function_ref (QQuickItem *, const QEvent *)> predicate) const { QVector targets; auto itemPrivate = QQuickItemPrivate::get(item); @@ -2089,13 +2089,9 @@ QVector QQuickDeliveryAgentPrivate::eventTargets(QQuickItem *item, return targets; } QList children = itemPrivate->paintOrderChildItems(); - if (predicate) { - const auto override = predicate(item, event); - if (override == true) - relevant = true; - else if (override == false) - relevant = false; - } + const std::optional override = predicate(item, event); + if (override.has_value()) + relevant = override.value(); if (relevant) { auto it = std::lower_bound(children.begin(), children.end(), 0, [](auto lhs, auto rhs) -> bool { return lhs->z() < rhs; }); @@ -2940,7 +2936,11 @@ bool QQuickDeliveryAgentPrivate::dragOverThreshold(QVector2D delta) */ QVector QQuickDeliveryAgentPrivate::contextMenuTargets(QQuickItem *item, const QContextMenuEvent *event) const { - return eventTargets(item, event, event->pos(), nullptr); + auto predicate = [](QQuickItem *, const QEvent *) -> std::optional { + return std::nullopt; + }; + + return eventTargets(item, event, event->pos(), predicate); } /*! diff --git a/src/quick/util/qquickdeliveryagent_p_p.h b/src/quick/util/qquickdeliveryagent_p_p.h index c937765e8a..d77fc44bee 100644 --- a/src/quick/util/qquickdeliveryagent_p_p.h +++ b/src/quick/util/qquickdeliveryagent_p_p.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -166,7 +167,7 @@ public: void deliverUpdatedPoints(QPointerEvent *event); void deliverMatchingPointsToItem(QQuickItem *item, bool isGrabber, QPointerEvent *pointerEvent, bool handlersOnly = false); - QVector eventTargets(QQuickItem *, const QEvent *event, QPointF scenePos, std::function (QQuickItem *, const QEvent *)> predicate) const; + QVector eventTargets(QQuickItem *, const QEvent *event, QPointF scenePos, qxp::function_ref (QQuickItem *, const QEvent *)> predicate) const; QVector pointerTargets(QQuickItem *, const QPointerEvent *event, const QEventPoint &point, bool checkMouseButtons, bool checkAcceptsTouch) const; QVector mergePointerTargets(const QVector &list1, const QVector &list2) const;