diff options
author | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2021-10-25 12:34:25 +0200 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2021-10-30 11:46:03 +0200 |
commit | e2e5f448ca20d904c6a14c2df6a0348cf60f5b52 (patch) | |
tree | 8f88920631403b7bb0938fb4615f3559574e9659 | |
parent | a887b7750cc8cb7fcc12e782eb046111f4a78902 (diff) |
Implement QTest:mouseMove widget overload to send event
We cannot assume that calling QCursor::setCursor results in a mouse move
event, and we can definitely not assume that the previously pressed
button (via QTest::mousePress) will be included in such an event.
Instead, follow the mechanism used in the QWindow-overload to keep track
of the mouse buttons pressed, and make those the buttons pressed in the
mouse move event we generate.
[ChangeLog][QTestLib] QTest::mouseMove no longer moves the mouse cursor
via QCursor::setPos, but instead generates a QEvent::MouseMove. Testing
of code that relies on QCursor::pos needs to be done with explicit calls
to QCursor::setPos.
Change-Id: Ia643bcc999498a0dc93479b77e107b989dfe202d
Reviewed-by: Jason McDonald <macadder1@gmail.com>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
-rw-r--r-- | src/testlib/qtestmouse.h | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/src/testlib/qtestmouse.h b/src/testlib/qtestmouse.h index fe89f371ca..26d3b50145 100644 --- a/src/testlib/qtestmouse.h +++ b/src/testlib/qtestmouse.h @@ -206,29 +206,36 @@ namespace QTest stateKey &= static_cast<unsigned int>(Qt::KeyboardModifierMask); QEvent::Type meType; - Qt::MouseButton meButton; + using namespace QTestPrivate; switch (action) { case MousePress: + qtestMouseButtons.setFlag(button, true); meType = QEvent::MouseButtonPress; - meButton = button; break; case MouseRelease: + qtestMouseButtons.setFlag(button, false); meType = QEvent::MouseButtonRelease; - meButton = Qt::MouseButton(); break; case MouseDClick: + qtestMouseButtons.setFlag(button, true); meType = QEvent::MouseButtonDblClick; - meButton = button; break; case MouseMove: - QCursor::setPos(widget->mapToGlobal(pos)); - qApp->processEvents(); - return; + // ### Qt 7: compatibility with < Qt 6.3, we should not rely on QCursor::setPos + // for generating mouse move events, and code that depends on QCursor::pos should + // be tested using QCursor::setPos explicitly. + if (qtestMouseButtons == Qt::NoButton) { + QCursor::setPos(widget->mapToGlobal(pos)); + qApp->processEvents(); + return; + } + meType = QEvent::MouseMove; + break; default: QTEST_ASSERT(false); } - QMouseEvent me(meType, pos, widget->mapToGlobal(pos), button, meButton, stateKey, QPointingDevice::primaryPointingDevice()); + QMouseEvent me(meType, pos, widget->mapToGlobal(pos), button, qtestMouseButtons, stateKey, QPointingDevice::primaryPointingDevice()); me.setTimestamp(lastMouseTimestamp); if (action == MouseRelease) // avoid double clicks being generated lastMouseTimestamp += mouseDoubleClickInterval; |