diff options
-rw-r--r-- | src/quick/util/qquickdeliveryagent.cpp | 10 | ||||
-rw-r--r-- | tests/auto/quick/qquickitem/tst_qquickitem.cpp | 42 | ||||
-rw-r--r-- | tests/manual/pointer/sidebar.qml | 12 |
3 files changed, 56 insertions, 8 deletions
diff --git a/src/quick/util/qquickdeliveryagent.cpp b/src/quick/util/qquickdeliveryagent.cpp index 098e215829..10ce45e2cf 100644 --- a/src/quick/util/qquickdeliveryagent.cpp +++ b/src/quick/util/qquickdeliveryagent.cpp @@ -931,12 +931,16 @@ bool QQuickDeliveryAgentPrivate::sendHoverEvent(QEvent::Type type, QQuickItem *i Qt::KeyboardModifiers modifiers, ulong timestamp, bool accepted) { - const QTransform transform = QQuickItemPrivate::get(item)->windowToItemTransform(); - - //create copy of event + auto itemPrivate = QQuickItemPrivate::get(item); + const QTransform transform = itemPrivate->windowToItemTransform(); QHoverEvent hoverEvent(type, transform.map(scenePos), transform.map(lastScenePos), modifiers); hoverEvent.setTimestamp(timestamp); hoverEvent.setAccepted(accepted); + const QTransform transformToGlobal = itemPrivate->windowToGlobalTransform(); + QMutableEventPoint &point = QMutableEventPoint::from(hoverEvent.point(0)); + point.setScenePosition(scenePos); + point.setGlobalPosition(transformToGlobal.map(scenePos)); + point.setGlobalLastPosition(transformToGlobal.map(lastScenePos)); hasFiltered.clear(); if (sendFilteredMouseEvent(&hoverEvent, item, item->parentItem())) diff --git a/tests/auto/quick/qquickitem/tst_qquickitem.cpp b/tests/auto/quick/qquickitem/tst_qquickitem.cpp index 8f8ae396e3..5c2feb1c2a 100644 --- a/tests/auto/quick/qquickitem/tst_qquickitem.cpp +++ b/tests/auto/quick/qquickitem/tst_qquickitem.cpp @@ -1559,18 +1559,37 @@ public: int hoverEnterCount; int hoverMoveCount; int hoverLeaveCount; + QPoint hoverPosition; + QPoint hoverScenePosition; + QPoint hoverGlobalPosition; + QPoint hoverLastGlobalPosition; protected: - virtual void hoverEnterEvent(QHoverEvent *event) { + void hoverEnterEvent(QHoverEvent *event) override { + qCDebug(lcTests) << static_cast<QSinglePointEvent *>(event) << event->position() << event->scenePosition() << event->globalPosition(); event->accept(); ++hoverEnterCount; + hoverPosition = event->position().toPoint(); + hoverScenePosition = event->scenePosition().toPoint(); + hoverGlobalPosition = event->globalPosition().toPoint(); + hoverLastGlobalPosition = event->points().first().globalLastPosition().toPoint(); } - virtual void hoverMoveEvent(QHoverEvent *event) { + void hoverMoveEvent(QHoverEvent *event) override { + qCDebug(lcTests) << static_cast<QSinglePointEvent *>(event) << event->position() << event->scenePosition() << event->globalPosition(); event->accept(); ++hoverMoveCount; + hoverPosition = event->position().toPoint(); + hoverScenePosition = event->scenePosition().toPoint(); + hoverGlobalPosition = event->globalPosition().toPoint(); + hoverLastGlobalPosition = event->points().first().globalLastPosition().toPoint(); } - virtual void hoverLeaveEvent(QHoverEvent *event) { + void hoverLeaveEvent(QHoverEvent *event) override { + qCDebug(lcTests) << static_cast<QSinglePointEvent *>(event) << event->position() << event->scenePosition() << event->globalPosition(); event->accept(); ++hoverLeaveCount; + hoverPosition = event->position().toPoint(); + hoverScenePosition = event->scenePosition().toPoint(); + hoverGlobalPosition = event->globalPosition().toPoint(); + hoverLastGlobalPosition = event->points().first().globalLastPosition().toPoint(); } }; @@ -1620,13 +1639,28 @@ void tst_qquickitem::hoverEvent() QTest::mouseMove(window, outside); item->resetCounters(); + auto checkPositions = [=](QPoint pt) { + QCOMPARE(item->hoverPosition, pt); + QCOMPARE(item->hoverScenePosition, item->mapToScene(pt).toPoint()); + QCOMPARE(item->hoverGlobalPosition, item->mapToGlobal(pt).toPoint()); + QVERIFY(!item->hoverLastGlobalPosition.isNull()); + }; + // Enter, then move twice inside, then leave. + const bool shouldReceiveHoverEvents = visible && acceptHoverEvents; QTest::mouseMove(window, inside); + if (shouldReceiveHoverEvents) + checkPositions(inside); QTest::mouseMove(window, anotherInside); + if (shouldReceiveHoverEvents) + checkPositions(anotherInside); QTest::mouseMove(window, inside); + if (shouldReceiveHoverEvents) + checkPositions(inside); QTest::mouseMove(window, outside); + if (shouldReceiveHoverEvents) + checkPositions(outside); - const bool shouldReceiveHoverEvents = visible && acceptHoverEvents; if (shouldReceiveHoverEvents) { QCOMPARE(item->hoverEnterCount, 1); QCOMPARE(item->hoverMoveCount, 2); diff --git a/tests/manual/pointer/sidebar.qml b/tests/manual/pointer/sidebar.qml index b7370a4fb7..cd59f1d5cf 100644 --- a/tests/manual/pointer/sidebar.qml +++ b/tests/manual/pointer/sidebar.qml @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2018 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the manual tests of the Qt Toolkit. @@ -187,4 +187,14 @@ Rectangle { anchors.fill: parent } } + + HoverHandler { + id: rootHover + } + + Text { + anchors.right: parent.right + color: "cyan" + text: "scene " + rootHover.point.scenePosition.x.toFixed(1) + ", " + rootHover.point.scenePosition.y.toFixed(1) + } } |