Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qtestmouse.h
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QTESTMOUSE_H
5#define QTESTMOUSE_H
6
7#if 0
8// inform syncqt
9#pragma qt_no_master_include
10#endif
11
12#include <QtTest/qttestglobal.h>
13#include <QtTest/qtestassert.h>
14#include <QtTest/qtestsystem.h>
15#include <QtTest/qtestspontaneevent.h>
16#include <QtCore/qpoint.h>
17#include <QtCore/qstring.h>
18#include <QtCore/qpointer.h>
19#include <QtGui/qevent.h>
20#include <QtGui/qwindow.h>
21
22#ifdef QT_WIDGETS_LIB
23#include <QtWidgets/qapplication.h>
24#include <QtWidgets/qwidget.h>
25#endif
26
27#include <QtCore/QDebug>
28
30
31Q_GUI_EXPORT void qt_handleMouseEvent(QWindow *window, const QPointF &local, const QPointF &global,
32 Qt::MouseButtons state, Qt::MouseButton button,
33 QEvent::Type type, Qt::KeyboardModifiers mods, int timestamp);
34
35namespace QTestPrivate
36{
37 extern Q_TESTLIB_EXPORT Qt::MouseButtons qtestMouseButtons;
38}
39
40namespace QTest
41{
43
44 extern Q_TESTLIB_EXPORT int lastMouseTimestamp;
45
46 // This value is used to emulate timestamps to avoid creating double clicks by mistake.
47 // Use this constant instead of QStyleHints::mouseDoubleClickInterval property to avoid tests
48 // to depend on platform themes.
49 static const int mouseDoubleClickInterval = 500;
50
68 Qt::KeyboardModifiers stateKey, QPoint pos, int delay=-1)
69 {
71 extern int Q_TESTLIB_EXPORT defaultMouseDelay();
72
73 // pos is in window local coordinates
74 const QSize windowSize = window->geometry().size();
75 if (windowSize.width() <= pos.x() || windowSize.height() <= pos.y()) {
76 qWarning("Mouse event at %d, %d occurs outside target window (%dx%d).",
77 pos.x(), pos.y(), windowSize.width(), windowSize.height());
78 }
79
80 int actualDelay = (delay == -1 || delay < defaultMouseDelay()) ? defaultMouseDelay() : delay;
81 lastMouseTimestamp += qMax(1, actualDelay);
82
83 if (pos.isNull())
84 pos = QPoint(window->width() / 2, window->height() / 2);
85
86 QTEST_ASSERT(!stateKey || stateKey & Qt::KeyboardModifierMask);
87
88 stateKey &= Qt::KeyboardModifierMask;
89
90 QPointF global = window->mapToGlobal(pos);
91 QPointer<QWindow> w(window);
92
93 using namespace QTestPrivate;
94 switch (action)
95 {
96 case MouseDClick:
97 qtestMouseButtons.setFlag(button, true);
99 stateKey, lastMouseTimestamp);
100 qtestMouseButtons.setFlag(button, false);
102 stateKey, lastMouseTimestamp);
104 case MousePress:
105 case MouseClick:
106 qtestMouseButtons.setFlag(button, true);
108 stateKey, lastMouseTimestamp);
109 if (action == MousePress)
110 break;
112 case MouseRelease:
113 qtestMouseButtons.setFlag(button, false);
115 stateKey, lastMouseTimestamp);
116 if (delay == -1)
117 lastMouseTimestamp += mouseDoubleClickInterval; // avoid double clicks being generated
118 break;
119 case MouseMove:
121 stateKey, lastMouseTimestamp);
122 break;
123 default:
124 QTEST_ASSERT(false);
125 }
126 qApp->processEvents();
127 }
128
130 Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(),
131 QPoint pos = QPoint(), int delay=-1)
132 { mouseEvent(MousePress, window, button, stateKey, pos, delay); }
134 Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(),
135 QPoint pos = QPoint(), int delay=-1)
136 { mouseEvent(MouseRelease, window, button, stateKey, pos, delay); }
138 Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(),
139 QPoint pos = QPoint(), int delay=-1)
140 { mouseEvent(MouseClick, window, button, stateKey, pos, delay); }
142 Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(),
143 QPoint pos = QPoint(), int delay=-1)
144 { mouseEvent(MouseDClick, window, button, stateKey, pos, delay); }
145 inline void mouseMove(QWindow *window, QPoint pos = QPoint(), int delay=-1)
146 { mouseEvent(MouseMove, window, Qt::NoButton, Qt::KeyboardModifiers(), pos, delay); }
147
148#ifdef QT_WIDGETS_LIB
150 Qt::KeyboardModifiers stateKey, QPoint pos, int delay=-1)
151 {
153
154 if (pos.isNull())
155 pos = widget->rect().center();
156
157#ifdef QTEST_QPA_MOUSE_HANDLING
160 mouseEvent(action, w, button, stateKey, w->mapFromGlobal(widget->mapToGlobal(pos)), delay);
161#else
162 extern int Q_TESTLIB_EXPORT defaultMouseDelay();
163
164 if (delay == -1 || delay < defaultMouseDelay())
165 delay = defaultMouseDelay();
166 lastMouseTimestamp += qMax(1, delay);
167
168 if (action == MouseClick) {
169 mouseEvent(MousePress, widget, button, stateKey, pos);
171 return;
172 }
173
174 QTEST_ASSERT(!stateKey || stateKey & Qt::KeyboardModifierMask);
175
176 stateKey &= Qt::KeyboardModifierMask;
177
178 QEvent::Type meType = QEvent::None;
179 using namespace QTestPrivate;
180 switch (action)
181 {
182 case MousePress:
183 qtestMouseButtons.setFlag(button, true);
185 break;
186 case MouseRelease:
187 qtestMouseButtons.setFlag(button, false);
189 break;
190 case MouseDClick:
191 qtestMouseButtons.setFlag(button, true);
193 break;
194 case MouseMove:
195 // ### Qt 7: compatibility with < Qt 6.3, we should not rely on QCursor::setPos
196 // for generating mouse move events, and code that depends on QCursor::pos should
197 // be tested using QCursor::setPos explicitly.
198 if (qtestMouseButtons == Qt::NoButton) {
200 qApp->processEvents();
201 return;
202 }
203 meType = QEvent::MouseMove;
204 break;
205 default:
206 QTEST_ASSERT(false);
207 }
208 QMouseEvent me(meType, pos, widget->mapToGlobal(pos), button, qtestMouseButtons, stateKey, QPointingDevice::primaryPointingDevice());
209 me.setTimestamp(lastMouseTimestamp);
210 if (action == MouseRelease) // avoid double clicks being generated
212
214 if (!qApp->notify(widget, &me)) {
215 static const char *const mouseActionNames[] =
216 { "MousePress", "MouseRelease", "MouseClick", "MouseDClick", "MouseMove" };
217 qWarning("Mouse event \"%s\" not accepted by receiving widget",
218 mouseActionNames[static_cast<int>(action)]);
219 }
220#endif
221 }
222
224 Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(),
225 QPoint pos = QPoint(), int delay=-1)
226 { mouseEvent(MousePress, widget, button, stateKey, pos, delay); }
228 Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(),
229 QPoint pos = QPoint(), int delay=-1)
230 { mouseEvent(MouseRelease, widget, button, stateKey, pos, delay); }
232 Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(),
233 QPoint pos = QPoint(), int delay=-1)
234 { mouseEvent(MouseClick, widget, button, stateKey, pos, delay); }
236 Qt::KeyboardModifiers stateKey = Qt::KeyboardModifiers(),
237 QPoint pos = QPoint(), int delay=-1)
238 { mouseEvent(MouseDClick, widget, button, stateKey, pos, delay); }
239 inline void mouseMove(QWidget *widget, QPoint pos = QPoint(), int delay=-1)
240 { mouseEvent(MouseMove, widget, Qt::NoButton, Qt::KeyboardModifiers(), pos, delay); }
241#endif // QT_WIDGETS_LIB
242}
243
245
246#endif // QTESTMOUSE_H
static void setPos(int x, int y)
Moves the cursor (hot spot) of the primary screen to the global screen position (x,...
Definition qcursor.cpp:240
Type
This enum type defines the valid event types in Qt.
Definition qcoreevent.h:51
@ MouseMove
Definition qcoreevent.h:63
@ MouseButtonPress
Definition qcoreevent.h:60
@ MouseButtonDblClick
Definition qcoreevent.h:62
@ MouseButtonRelease
Definition qcoreevent.h:61
\inmodule QtGui
Definition qevent.h:196
\inmodule QtCore\reentrant
Definition qpoint.h:217
\inmodule QtCore\reentrant
Definition qpoint.h:25
static const QPointingDevice * primaryPointingDevice(const QString &seatName=QString())
Returns the primary pointing device (the core pointer, traditionally assumed to be a mouse) on the gi...
constexpr QPoint center() const noexcept
Returns the center point of the rectangle.
Definition qrect.h:233
\inmodule QtCore
Definition qsize.h:25
constexpr int height() const noexcept
Returns the height.
Definition qsize.h:133
constexpr int width() const noexcept
Returns the width.
Definition qsize.h:130
static void setSpontaneous(QEvent *ev)
The QWidget class is the base class of all user interface objects.
Definition qwidget.h:99
QWidget * window() const
Returns the window for this widget, i.e.
Definition qwidget.cpp:4313
QPointF mapToGlobal(const QPointF &) const
Translates the widget coordinate pos to global screen coordinates.
QRect rect
the internal geometry of the widget excluding any window frame
Definition qwidget.h:116
QWindow * windowHandle() const
If this is a native widget, return the associated QWindow.
Definition qwidget.cpp:2483
QPointF mapFromGlobal(const QPointF &) const
Translates the global screen coordinate pos to widget coordinates.
\inmodule QtGui
Definition qwindow.h:63
QOpenGLWidget * widget
[1]
QPushButton * button
[2]
else opt state
[0]
Combined button and popup list for selecting options.
Q_TESTLIB_EXPORT Qt::MouseButtons qtestMouseButtons
Q_TESTLIB_EXPORT int lastMouseTimestamp
int Q_TESTLIB_EXPORT defaultMouseDelay()
MouseAction
Definition qtestmouse.h:42
@ MouseMove
Definition qtestmouse.h:42
@ MousePress
Definition qtestmouse.h:42
@ MouseDClick
Definition qtestmouse.h:42
@ MouseClick
Definition qtestmouse.h:42
@ MouseRelease
Definition qtestmouse.h:42
static void mouseEvent(MouseAction action, QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey, QPoint pos, int delay=-1)
Definition qtestmouse.h:67
void mouseMove(QWindow *window, QPoint pos=QPoint(), int delay=-1)
Definition qtestmouse.h:145
static const int mouseDoubleClickInterval
Definition qtestmouse.h:49
void mouseDClick(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey=Qt::KeyboardModifiers(), QPoint pos=QPoint(), int delay=-1)
Definition qtestmouse.h:141
void mouseRelease(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey=Qt::KeyboardModifiers(), QPoint pos=QPoint(), int delay=-1)
Definition qtestmouse.h:133
void mouseClick(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey=Qt::KeyboardModifiers(), QPoint pos=QPoint(), int delay=-1)
Definition qtestmouse.h:137
void mousePress(QWindow *window, Qt::MouseButton button, Qt::KeyboardModifiers stateKey=Qt::KeyboardModifiers(), QPoint pos=QPoint(), int delay=-1)
Definition qtestmouse.h:129
MouseButton
Definition qnamespace.h:56
@ NoButton
Definition qnamespace.h:57
@ KeyboardModifierMask
#define Q_FALLTHROUGH()
#define qApp
#define qWarning
Definition qlogging.h:166
constexpr const T & qMax(const T &a, const T &b)
Definition qminmax.h:42
GLfloat GLfloat GLfloat w
[0]
GLenum type
#define QTEST_ASSERT(cond)
Definition qtestassert.h:11
QT_BEGIN_NAMESPACE Q_GUI_EXPORT void qt_handleMouseEvent(QWindow *window, const QPointF &local, const QPointF &global, Qt::MouseButtons state, Qt::MouseButton button, QEvent::Type type, Qt::KeyboardModifiers mods, int timestamp)
Q_GUI_EXPORT void qt_handleMouseEvent(QWindow *window, const QPointF &local, const QPointF &global, Qt::MouseButtons state, Qt::MouseButton button, QEvent::Type type, Qt::KeyboardModifiers mods, int timestamp)
aWidget window() -> setWindowTitle("New Window Title")
[2]
QJSValue global