summaryrefslogtreecommitdiffstats
path: root/src/testlib
diff options
context:
space:
mode:
authorVolker Hilsheimer <volker.hilsheimer@qt.io>2021-10-25 12:34:25 +0200
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2021-10-30 11:46:03 +0200
commite2e5f448ca20d904c6a14c2df6a0348cf60f5b52 (patch)
tree8f88920631403b7bb0938fb4615f3559574e9659 /src/testlib
parenta887b7750cc8cb7fcc12e782eb046111f4a78902 (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>
Diffstat (limited to 'src/testlib')
-rw-r--r--src/testlib/qtestmouse.h23
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;