diff options
-rw-r--r-- | src/quick/handlers/qquickpointersinglehandler.cpp | 7 | ||||
-rw-r--r-- | src/quick/items/qquickevents.cpp | 11 | ||||
-rw-r--r-- | src/quick/items/qquickevents_p_p.h | 2 |
3 files changed, 15 insertions, 5 deletions
diff --git a/src/quick/handlers/qquickpointersinglehandler.cpp b/src/quick/handlers/qquickpointersinglehandler.cpp index d9a9d692ae..112c680d3c 100644 --- a/src/quick/handlers/qquickpointersinglehandler.cpp +++ b/src/quick/handlers/qquickpointersinglehandler.cpp @@ -148,15 +148,17 @@ bool QQuickPointerSingleHandler::wantsEventPoint(QQuickEventPoint *point) void QQuickPointerSingleHandler::onGrabChanged(QQuickPointerHandler *grabber, QQuickEventPoint::GrabState stateChange, QQuickEventPoint *point) { - QQuickPointerHandler::onGrabChanged(grabber, stateChange, point); if (grabber != this) return; switch (stateChange) { case QQuickEventPoint::GrabExclusive: + m_sceneGrabPos = point->sceneGrabPos(); setActive(true); - Q_FALLTHROUGH(); + QQuickPointerHandler::onGrabChanged(grabber, stateChange, point); + break; case QQuickEventPoint::GrabPassive: m_sceneGrabPos = point->sceneGrabPos(); + QQuickPointerHandler::onGrabChanged(grabber, stateChange, point); break; case QQuickEventPoint::OverrideGrabPassive: return; // don't emit @@ -165,6 +167,7 @@ void QQuickPointerSingleHandler::onGrabChanged(QQuickPointerHandler *grabber, QQ case QQuickEventPoint::CancelGrabPassive: case QQuickEventPoint::CancelGrabExclusive: // the grab is lost or relinquished, so the point is no longer relevant + QQuickPointerHandler::onGrabChanged(grabber, stateChange, point); reset(); break; } diff --git a/src/quick/items/qquickevents.cpp b/src/quick/items/qquickevents.cpp index 49ed0f050e..61d843210e 100644 --- a/src/quick/items/qquickevents.cpp +++ b/src/quick/items/qquickevents.cpp @@ -650,6 +650,10 @@ void QQuickEventPoint::setGrabberPointerHandler(QQuickPointerHandler *grabber, b if (exclusive) { if (grabber != m_exclusiveGrabber.data()) { if (grabber) { + // set variables before notifying the new grabber + m_exclusiveGrabber = QPointer<QObject>(grabber); + m_grabberIsHandler = true; + m_sceneGrabPos = m_scenePos; grabber->onGrabChanged(grabber, GrabExclusive, this); for (QPointer<QQuickPointerHandler> passiveGrabber : m_passiveGrabbers) { if (passiveGrabber != grabber) @@ -664,7 +668,7 @@ void QQuickEventPoint::setGrabberPointerHandler(QQuickPointerHandler *grabber, b if (pointerEvent()->asPointerTouchEvent()) oldGrabberItem->touchUngrabEvent(); } - + // set variables after notifying the old grabber m_exclusiveGrabber = QPointer<QObject>(grabber); m_grabberIsHandler = true; m_sceneGrabPos = m_scenePos; @@ -943,8 +947,9 @@ QQuickPointerEvent *QQuickPointerTouchEvent::reset(QEvent *event) point->setGrabberItem(nullptr); point->clearPassiveGrabbers(); } else { - point->setExclusiveGrabber(grabbers.at(i)); - point->setPassiveGrabbers(passiveGrabberses.at(i)); + // Restore the grabbers without notifying (don't call onGrabChanged) + point->m_exclusiveGrabber = grabbers.at(i); + point->m_passiveGrabbers = passiveGrabberses.at(i); } } m_pointCount = newPointCount; diff --git a/src/quick/items/qquickevents_p_p.h b/src/quick/items/qquickevents_p_p.h index c4200ac550..2eebf131bc 100644 --- a/src/quick/items/qquickevents_p_p.h +++ b/src/quick/items/qquickevents_p_p.h @@ -370,6 +370,8 @@ private: QSizeF m_ellipseDiameters; QPointingDeviceUniqueId m_uniqueId; + friend class QQuickPointerTouchEvent; + Q_DISABLE_COPY(QQuickEventTouchPoint) }; |