aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn Rutledge <shawn.rutledge@qt.io>2021-07-02 21:27:54 +0200
committerShawn Rutledge <shawn.rutledge@qt.io>2021-07-06 13:03:04 +0200
commitf6f7233891f3ac71f18e7a994847c39362e857dd (patch)
tree2e092faf2e826828fb7554335d3f356120d1a746
parent1775bbc6d4231fd10ccfcea006d78d8769b854a2 (diff)
Send hover events with correct scene and global positions
Task-number: QTBUG-94971 Change-Id: I047223dfdb76a6f1237b9d15b54381cd085aa1ac Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> (cherry picked from commit 0a271b5cd4da9e13accbf63a576413c45f367adc)
-rw-r--r--src/quick/util/qquickdeliveryagent.cpp10
-rw-r--r--tests/auto/quick/qquickitem/tst_qquickitem.cpp42
-rw-r--r--tests/manual/pointer/sidebar.qml12
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)
+ }
}