diff options
author | Jan Arve Saether <jan-arve.saether@qt.io> | 2017-07-27 10:42:04 +0200 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2017-08-08 10:50:29 +0000 |
commit | 1b0c9b46ce13b0f9c533f18fb420ff10ad56e4f6 (patch) | |
tree | c7c48d968cbaac7450a84a18bc472679d451c6dc /src/quick/items | |
parent | 2329a3145e59c16b5bbc37cedad7e67e16f14fb8 (diff) |
Fix some bugs related to child mouse filteringwip/pointerhandler
- Only abort event delivery early if event that got filtered was accepted
(previously we aborted as soon as the event got filtered, even if the
event was filtered, but explicitly *not* accepted)
- If the event that got filtered was *not* accepted, we do not abort event
delivery, but we need to remove the item from the list of target items that
we will deliver to later
- If childMouseEventFilter returns true it should not automatically mean that
the event was accepted.
Change-Id: I2f2415379061131af1d5102e03d01f010e1a8168
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
Diffstat (limited to 'src/quick/items')
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 12 | ||||
-rw-r--r-- | src/quick/items/qquickwindow_p.h | 2 |
2 files changed, 9 insertions, 5 deletions
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index e2dcff7770..7b331251f0 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -2421,8 +2421,12 @@ bool QQuickWindowPrivate::deliverPressOrReleaseEvent(QQuickPointerEvent *event, if (allowChildEventFiltering && !handlersOnly) { updateFilteringParentItems(targetItems); - if (sendFilteredPointerEvent(event, nullptr)) - return true; + QQuickItem *filteredItem; + if (sendFilteredPointerEvent(event, nullptr, &filteredItem)) { + if (event->isAccepted()) + return true; + targetItems.removeAll(filteredItem); + } } for (QQuickItem *item: targetItems) { @@ -2745,7 +2749,7 @@ void QQuickWindowPrivate::updateFilteringParentItems(const QVector<QQuickItem *> } } -bool QQuickWindowPrivate::sendFilteredPointerEvent(QQuickPointerEvent *event, QQuickItem *receiver) +bool QQuickWindowPrivate::sendFilteredPointerEvent(QQuickPointerEvent *event, QQuickItem *receiver, QQuickItem **itemThatFiltered) { if (!allowChildEventFiltering) return false; @@ -2759,7 +2763,7 @@ bool QQuickWindowPrivate::sendFilteredPointerEvent(QQuickPointerEvent *event, QQ QPointF localPos = item->mapFromScene(pme->point(0)->scenePos()); QMouseEvent *me = pme->asMouseEvent(localPos); if (filteringParent->childMouseEventFilter(item, me)) { - event->setAccepted(true); + if (itemThatFiltered) *itemThatFiltered = item; ret = true; } } diff --git a/src/quick/items/qquickwindow_p.h b/src/quick/items/qquickwindow_p.h index c2d2a7a8a4..14564a7f55 100644 --- a/src/quick/items/qquickwindow_p.h +++ b/src/quick/items/qquickwindow_p.h @@ -148,7 +148,7 @@ public: static QMouseEvent *cloneMouseEvent(QMouseEvent *event, QPointF *transformedLocalPos = 0); void deliverMouseEvent(QQuickPointerMouseEvent *pointerEvent); bool sendFilteredMouseEvent(QQuickItem *, QQuickItem *, QEvent *, QSet<QQuickItem *> *); - bool sendFilteredPointerEvent(QQuickPointerEvent *event, QQuickItem *receiver); + bool sendFilteredPointerEvent(QQuickPointerEvent *event, QQuickItem *receiver, QQuickItem **itemThatFiltered = 0); #if QT_CONFIG(wheelevent) bool deliverWheelEvent(QQuickItem *, QWheelEvent *); #endif |