1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the QtGui module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#include "qevent.h"
41#include "qcursor.h"
42#include "private/qguiapplication_p.h"
43#include "private/qtouchdevice_p.h"
44#include "qpa/qplatformintegration.h"
45#include "private/qevent_p.h"
46#include "qfile.h"
47#include "qhashfunctions.h"
48#include "qmetaobject.h"
49#include "qmimedata.h"
50#include "qevent_p.h"
51#include "qmath.h"
52
53#if QT_CONFIG(draganddrop)
54#include <qpa/qplatformdrag.h>
55#include <private/qdnd_p.h>
56#endif
57
58#include <private/qdebug_p.h>
59
60QT_BEGIN_NAMESPACE
61
62/*!
63 \class QEnterEvent
64 \ingroup events
65 \inmodule QtGui
66
67 \brief The QEnterEvent class contains parameters that describe an enter event.
68
69 Enter events occur when the mouse cursor enters a window or a widget.
70
71 \since 5.0
72*/
73
74/*!
75 Constructs an enter event object.
76
77 The points \a localPos, \a windowPos and \a screenPos specify the
78 mouse cursor's position relative to the receiving widget or item,
79 window, and screen, respectively.
80*/
81
82QEnterEvent::QEnterEvent(const QPointF &localPos, const QPointF &windowPos, const QPointF &screenPos)
83 : QEvent(QEvent::Enter)
84 , l(localPos)
85 , w(windowPos)
86 , s(screenPos)
87{
88}
89
90/*!
91 \internal
92*/
93QEnterEvent::~QEnterEvent()
94{
95}
96
97/*!
98 \fn QPoint QEnterEvent::globalPos() const
99
100 Returns the global position of the mouse cursor \e{at the time of the event}.
101*/
102/*!
103 \fn int QEnterEvent::globalX() const
104
105 Returns the global position on the X-axis of the mouse cursor \e{at the time of the event}.
106*/
107/*!
108 \fn int QEnterEvent::globalY() const
109
110 Returns the global position on the Y-axis of the mouse cursor \e{at the time of the event}.
111*/
112/*!
113 \fn QPointF QEnterEvent::localPos() const
114
115 Returns the mouse cursor's position relative to the receiving widget.
116*/
117/*!
118 \fn QPoint QEnterEvent::pos() const
119
120 Returns the position of the mouse cursor relative to the receiving widget.
121*/
122/*!
123 \fn QPointF QEnterEvent::screenPos() const
124
125 Returns the position of the mouse cursor relative to the receiving screen.
126*/
127/*!
128 \fn QPointF QEnterEvent::windowPos() const
129
130 Returns the position of the mouse cursor relative to the receiving window.
131*/
132/*!
133 \fn int QEnterEvent::x() const
134
135 Returns the x position of the mouse cursor relative to the receiving widget.
136*/
137/*!
138 \fn int QEnterEvent::y() const
139
140 Returns the y position of the mouse cursor relative to the receiving widget.
141*/
142
143/*!
144 \class QInputEvent
145 \ingroup events
146 \inmodule QtGui
147
148 \brief The QInputEvent class is the base class for events that
149 describe user input.
150*/
151
152/*!
153 \internal
154*/
155QInputEvent::QInputEvent(Type type, Qt::KeyboardModifiers modifiers)
156 : QEvent(type), modState(modifiers), ts(0)
157{}
158
159/*!
160 \internal
161*/
162QInputEvent::~QInputEvent()
163{
164}
165
166/*!
167 \fn Qt::KeyboardModifiers QInputEvent::modifiers() const
168
169 Returns the keyboard modifier flags that existed immediately
170 before the event occurred.
171
172 \sa QGuiApplication::keyboardModifiers()
173*/
174
175/*! \fn void QInputEvent::setModifiers(Qt::KeyboardModifiers modifiers)
176
177 \internal
178
179 Sets the keyboard modifiers flags for this event.
180*/
181
182/*!
183 \fn ulong QInputEvent::timestamp() const
184
185 Returns the window system's timestamp for this event.
186 It will normally be in milliseconds since some arbitrary point
187 in time, such as the time when the system was started.
188*/
189
190/*! \fn void QInputEvent::setTimestamp(ulong atimestamp)
191
192 \internal
193
194 Sets the timestamp for this event.
195*/
196
197/*!
198 \class QMouseEvent
199 \ingroup events
200 \inmodule QtGui
201
202 \brief The QMouseEvent class contains parameters that describe a mouse event.
203
204 Mouse events occur when a mouse button is pressed or released
205 inside a widget, or when the mouse cursor is moved.
206
207 Mouse move events will occur only when a mouse button is pressed
208 down, unless mouse tracking has been enabled with
209 QWidget::setMouseTracking().
210
211 Qt automatically grabs the mouse when a mouse button is pressed
212 inside a widget; the widget will continue to receive mouse events
213 until the last mouse button is released.
214
215 A mouse event contains a special accept flag that indicates
216 whether the receiver wants the event. You should call ignore() if
217 the mouse event is not handled by your widget. A mouse event is
218 propagated up the parent widget chain until a widget accepts it
219 with accept(), or an event filter consumes it.
220
221 \note If a mouse event is propagated to a \l{QWidget}{widget} for
222 which Qt::WA_NoMousePropagation has been set, that mouse event
223 will not be propagated further up the parent widget chain.
224
225 The state of the keyboard modifier keys can be found by calling the
226 \l{QInputEvent::modifiers()}{modifiers()} function, inherited from
227 QInputEvent.
228
229 The functions pos(), x(), and y() give the cursor position
230 relative to the widget that receives the mouse event. If you
231 move the widget as a result of the mouse event, use the global
232 position returned by globalPos() to avoid a shaking motion.
233
234 The QWidget::setEnabled() function can be used to enable or
235 disable mouse and keyboard events for a widget.
236
237 Reimplement the QWidget event handlers, QWidget::mousePressEvent(),
238 QWidget::mouseReleaseEvent(), QWidget::mouseDoubleClickEvent(),
239 and QWidget::mouseMoveEvent() to receive mouse events in your own
240 widgets.
241
242 \sa QWidget::setMouseTracking(), QWidget::grabMouse(),
243 QCursor::pos()
244*/
245
246/*!
247 Constructs a mouse event object.
248
249 The \a type parameter must be one of QEvent::MouseButtonPress,
250 QEvent::MouseButtonRelease, QEvent::MouseButtonDblClick,
251 or QEvent::MouseMove.
252
253 The \a localPos is the mouse cursor's position relative to the
254 receiving widget or item. The window position is set to the same value
255 as \a localPos.
256 The \a button that caused the event is given as a value from
257 the Qt::MouseButton enum. If the event \a type is
258 \l MouseMove, the appropriate button for this event is Qt::NoButton.
259 The mouse and keyboard states at the time of the event are specified by
260 \a buttons and \a modifiers.
261
262 The screenPos() is initialized to QCursor::pos(), which may not
263 be appropriate. Use the other constructor to specify the global
264 position explicitly.
265*/
266QMouseEvent::QMouseEvent(Type type, const QPointF &localPos, Qt::MouseButton button,
267 Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers)
268 : QInputEvent(type, modifiers), l(localPos), w(localPos), b(button), mouseState(buttons), caps(0)
269{
270#ifndef QT_NO_CURSOR
271 s = QCursor::pos();
272#endif
273}
274
275
276/*!
277 Constructs a mouse event object.
278
279 The \a type parameter must be QEvent::MouseButtonPress,
280 QEvent::MouseButtonRelease, QEvent::MouseButtonDblClick,
281 or QEvent::MouseMove.
282
283 The \a localPos is the mouse cursor's position relative to the
284 receiving widget or item. The cursor's position in screen coordinates is
285 specified by \a screenPos. The window position is set to the same value
286 as \a localPos. The \a button that caused the event is
287 given as a value from the \l Qt::MouseButton enum. If the event \a
288 type is \l MouseMove, the appropriate button for this event is
289 Qt::NoButton. \a buttons is the state of all buttons at the
290 time of the event, \a modifiers the state of all keyboard
291 modifiers.
292
293*/
294QMouseEvent::QMouseEvent(Type type, const QPointF &localPos, const QPointF &screenPos,
295 Qt::MouseButton button, Qt::MouseButtons buttons,
296 Qt::KeyboardModifiers modifiers)
297 : QMouseEvent(type, localPos, localPos, screenPos, button, buttons, modifiers)
298{}
299
300/*!
301 Constructs a mouse event object.
302
303 The \a type parameter must be QEvent::MouseButtonPress,
304 QEvent::MouseButtonRelease, QEvent::MouseButtonDblClick,
305 or QEvent::MouseMove.
306
307 The points \a localPos, \a windowPos and \a screenPos specify the
308 mouse cursor's position relative to the receiving widget or item,
309 window, and screen, respectively.
310
311 The \a button that caused the event is
312 given as a value from the \l Qt::MouseButton enum. If the event \a
313 type is \l MouseMove, the appropriate button for this event is
314 Qt::NoButton. \a buttons is the state of all buttons at the
315 time of the event, \a modifiers the state of all keyboard
316 modifiers.
317
318*/
319QMouseEvent::QMouseEvent(Type type, const QPointF &localPos, const QPointF &windowPos, const QPointF &screenPos,
320 Qt::MouseButton button, Qt::MouseButtons buttons,
321 Qt::KeyboardModifiers modifiers)
322 : QInputEvent(type, modifiers), l(localPos), w(windowPos), s(screenPos), b(button), mouseState(buttons), caps(0)
323{}
324
325/*!
326 \since 5.6
327
328 Constructs a mouse event object.
329
330 The \a type parameter must be QEvent::MouseButtonPress,
331 QEvent::MouseButtonRelease, QEvent::MouseButtonDblClick,
332 or QEvent::MouseMove.
333
334 The points \a localPos, \a windowPos and \a screenPos specify the
335 mouse cursor's position relative to the receiving widget or item,
336 window, and screen, respectively.
337
338 The \a button that caused the event is given as a value from the
339 \l Qt::MouseButton enum. If the event \a type is \l MouseMove,
340 the appropriate button for this event is Qt::NoButton. \a buttons
341 is the state of all buttons at the time of the event, \a modifiers
342 is the state of all keyboard modifiers.
343
344 The source of the event is specified by \a source.
345
346*/
347QMouseEvent::QMouseEvent(QEvent::Type type, const QPointF &localPos, const QPointF &windowPos, const QPointF &screenPos,
348 Qt::MouseButton button, Qt::MouseButtons buttons,
349 Qt::KeyboardModifiers modifiers, Qt::MouseEventSource source)
350 : QMouseEvent(type, localPos, windowPos, screenPos, button, buttons, modifiers)
351{
352 QGuiApplicationPrivate::setMouseEventSource(event: this, source);
353}
354
355/*!
356 \internal
357*/
358QMouseEvent::~QMouseEvent()
359{
360}
361
362/*!
363 \since 5.3
364
365 Returns information about the mouse event source.
366
367 The mouse event source can be used to distinguish between genuine
368 and artificial mouse events. The latter are events that are
369 synthesized from touch events by the operating system or Qt itself.
370
371 \note Many platforms provide no such information. On such platforms
372 \l Qt::MouseEventNotSynthesized is returned always.
373
374 \sa Qt::MouseEventSource
375 \sa QGraphicsSceneMouseEvent::source()
376 */
377Qt::MouseEventSource QMouseEvent::source() const
378{
379 return QGuiApplicationPrivate::mouseEventSource(event: this);
380}
381
382/*!
383 \since 5.3
384
385 Returns the mouse event flags.
386
387 The mouse event flags provide additional information about a mouse event.
388
389 \sa Qt::MouseEventFlag
390 \sa QGraphicsSceneMouseEvent::flags()
391 */
392Qt::MouseEventFlags QMouseEvent::flags() const
393{
394 return QGuiApplicationPrivate::mouseEventFlags(event: this);
395}
396
397/*!
398 \fn QPointF QMouseEvent::localPos() const
399
400 \since 5.0
401
402 Returns the position of the mouse cursor as a QPointF, relative to the
403 widget or item that received the event.
404
405 If you move the widget as a result of the mouse event, use the
406 screen position returned by screenPos() to avoid a shaking
407 motion.
408
409 \sa x(), y(), windowPos(), screenPos()
410*/
411
412/*!
413 \fn void QMouseEvent::setLocalPos(const QPointF &localPosition)
414
415 \since 5.8
416
417 \internal
418
419 Sets the local position in the mouse event to \a localPosition. This allows to re-use one event
420 when sending it to a series of receivers that expect the local pos in their
421 respective local coordinates.
422*/
423
424/*!
425 \fn QPointF QMouseEvent::windowPos() const
426
427 \since 5.0
428
429 Returns the position of the mouse cursor as a QPointF, relative to the
430 window that received the event.
431
432 If you move the widget as a result of the mouse event, use the
433 global position returned by globalPos() to avoid a shaking
434 motion.
435
436 \sa x(), y(), pos(), localPos(), screenPos()
437*/
438
439/*!
440 \fn QPointF QMouseEvent::screenPos() const
441
442 \since 5.0
443
444 Returns the position of the mouse cursor as a QPointF, relative to the
445 screen that received the event.
446
447 \sa x(), y(), pos(), localPos(), windowPos()
448*/
449
450/*!
451 \fn QPoint QMouseEvent::pos() const
452
453 Returns the position of the mouse cursor, relative to the widget
454 that received the event.
455
456 If you move the widget as a result of the mouse event, use the
457 global position returned by globalPos() to avoid a shaking
458 motion.
459
460 \sa x(), y(), globalPos()
461*/
462
463/*!
464 \fn QPoint QMouseEvent::globalPos() const
465
466 Returns the global position of the mouse cursor \e{at the time
467 of the event}. This is important on asynchronous window systems
468 like X11. Whenever you move your widgets around in response to
469 mouse events, globalPos() may differ a lot from the current
470 pointer position QCursor::pos(), and from
471 QWidget::mapToGlobal(pos()).
472
473 \sa globalX(), globalY()
474*/
475
476/*!
477 \fn int QMouseEvent::x() const
478
479 Returns the x position of the mouse cursor, relative to the
480 widget that received the event.
481
482 \sa y(), pos()
483*/
484
485/*!
486 \fn int QMouseEvent::y() const
487
488 Returns the y position of the mouse cursor, relative to the
489 widget that received the event.
490
491 \sa x(), pos()
492*/
493
494/*!
495 \fn int QMouseEvent::globalX() const
496
497 Returns the global x position of the mouse cursor at the time of
498 the event.
499
500 \sa globalY(), globalPos()
501*/
502
503/*!
504 \fn int QMouseEvent::globalY() const
505
506 Returns the global y position of the mouse cursor at the time of
507 the event.
508
509 \sa globalX(), globalPos()
510*/
511
512/*!
513 \fn Qt::MouseButton QMouseEvent::button() const
514
515 Returns the button that caused the event.
516
517 Note that the returned value is always Qt::NoButton for mouse
518 move events.
519
520 \sa buttons(), Qt::MouseButton
521*/
522
523/*!
524 \fn Qt::MouseButton QMouseEvent::buttons() const
525
526 Returns the button state when the event was generated. The button
527 state is a combination of Qt::LeftButton, Qt::RightButton,
528 Qt::MiddleButton using the OR operator. For mouse move events,
529 this is all buttons that are pressed down. For mouse press and
530 double click events this includes the button that caused the
531 event. For mouse release events this excludes the button that
532 caused the event.
533
534 \sa button(), Qt::MouseButton
535*/
536
537/*!
538 \class QHoverEvent
539 \ingroup events
540 \inmodule QtGui
541
542 \brief The QHoverEvent class contains parameters that describe a mouse event.
543
544 Mouse events occur when a mouse cursor is moved into, out of, or within a
545 widget, and if the widget has the Qt::WA_Hover attribute.
546
547 The function pos() gives the current cursor position, while oldPos() gives
548 the old mouse position.
549
550 There are a few similarities between the events QEvent::HoverEnter
551 and QEvent::HoverLeave, and the events QEvent::Enter and QEvent::Leave.
552 However, they are slightly different because we do an update() in the event
553 handler of HoverEnter and HoverLeave.
554
555 QEvent::HoverMove is also slightly different from QEvent::MouseMove. Let us
556 consider a top-level window A containing a child B which in turn contains a
557 child C (all with mouse tracking enabled):
558
559 \image hoverevents.png
560
561 Now, if you move the cursor from the top to the bottom in the middle of A,
562 you will get the following QEvent::MouseMove events:
563
564 \list 1
565 \li A::MouseMove
566 \li B::MouseMove
567 \li C::MouseMove
568 \endlist
569
570 You will get the same events for QEvent::HoverMove, except that the event
571 always propagates to the top-level regardless whether the event is accepted
572 or not. It will only stop propagating with the Qt::WA_NoMousePropagation
573 attribute.
574
575 In this case the events will occur in the following way:
576
577 \list 1
578 \li A::HoverMove
579 \li A::HoverMove, B::HoverMove
580 \li A::HoverMove, B::HoverMove, C::HoverMove
581 \endlist
582
583*/
584
585/*!
586 \fn QPoint QHoverEvent::pos() const
587
588 Returns the position of the mouse cursor, relative to the widget
589 that received the event.
590
591 On QEvent::HoverLeave events, this position will always be
592 QPoint(-1, -1).
593
594 \sa oldPos()
595*/
596
597/*!
598 \fn QPoint QHoverEvent::oldPos() const
599
600 Returns the previous position of the mouse cursor, relative to the widget
601 that received the event. If there is no previous position, oldPos() will
602 return the same position as pos().
603
604 On QEvent::HoverEnter events, this position will always be
605 QPoint(-1, -1).
606
607 \sa pos()
608*/
609
610/*!
611 \fn const QPointF &QHoverEvent::posF() const
612
613 Returns the position of the mouse cursor, relative to the widget
614 that received the event.
615
616 On QEvent::HoverLeave events, this position will always be
617 QPointF(-1, -1).
618
619 \sa oldPosF()
620*/
621
622/*!
623 \fn const QPointF &QHoverEvent::oldPosF() const
624
625 Returns the previous position of the mouse cursor, relative to the widget
626 that received the event. If there is no previous position, oldPosF() will
627 return the same position as posF().
628
629 On QEvent::HoverEnter events, this position will always be
630 QPointF(-1, -1).
631
632 \sa posF()
633*/
634
635/*!
636 Constructs a hover event object.
637
638 The \a type parameter must be QEvent::HoverEnter,
639 QEvent::HoverLeave, or QEvent::HoverMove.
640
641 The \a pos is the current mouse cursor's position relative to the
642 receiving widget, while \a oldPos is its previous such position.
643 \a modifiers hold the state of all keyboard modifiers at the time
644 of the event.
645*/
646QHoverEvent::QHoverEvent(Type type, const QPointF &pos, const QPointF &oldPos, Qt::KeyboardModifiers modifiers)
647 : QInputEvent(type, modifiers), p(pos), op(oldPos)
648{
649}
650
651/*!
652 \internal
653*/
654QHoverEvent::~QHoverEvent()
655{
656}
657
658
659/*!
660 \class QWheelEvent
661 \brief The QWheelEvent class contains parameters that describe a wheel event.
662 \inmodule QtGui
663
664 \ingroup events
665
666 Wheel events are sent to the widget under the mouse cursor, but
667 if that widget does not handle the event they are sent to the
668 focus widget. Wheel events are generated for both mouse wheels
669 and trackpad scroll gestures. There are two ways to read the
670 wheel event delta: angleDelta() returns the deltas in wheel
671 degrees. These values are always provided. pixelDelta() returns
672 the deltas in screen pixels, and is available on platforms that
673 have high-resolution trackpads, such as \macos. If that is the
674 case, source() will return Qt::MouseEventSynthesizedBySystem.
675
676 The functions pos() and globalPos() return the mouse cursor's
677 location at the time of the event.
678
679 A wheel event contains a special accept flag that indicates
680 whether the receiver wants the event. You should call ignore() if
681 you do not handle the wheel event; this ensures that it will be
682 sent to the parent widget.
683
684 The QWidget::setEnabled() function can be used to enable or
685 disable mouse and keyboard events for a widget.
686
687 The event handler QWidget::wheelEvent() receives wheel events.
688
689 \sa QMouseEvent, QWidget::grabMouse()
690*/
691
692/*!
693 \enum QWheelEvent::anonymous
694 \internal
695
696 \value DefaultDeltasPerStep Defaqult deltas per step
697*/
698
699/*!
700 \fn Qt::MouseButtons QWheelEvent::buttons() const
701
702 Returns the mouse state when the event occurred.
703*/
704
705/*!
706 \fn Qt::MouseEventSource QWheelEvent::source() const
707 \since 5.5
708
709 Returns information about the wheel event source.
710
711 The source can be used to distinguish between events that come from a mouse
712 with a physical wheel and events that are generated by some other means,
713 such as a flick gesture on a touchpad.
714
715 \note Many platforms provide no such information. On such platforms
716 \l Qt::MouseEventNotSynthesized is returned always.
717
718 \sa Qt::MouseEventSource
719*/
720
721/*!
722 \fn bool QWheelEvent::inverted() const
723 \since 5.7
724
725 Returns whether the delta values delivered with the event are inverted.
726
727 Normally, a vertical wheel will produce a QWheelEvent with positive delta
728 values if the top of the wheel is rotating away from the hand operating it.
729 Similarly, a horizontal wheel movement will produce a QWheelEvent with
730 positive delta values if the top of the wheel is moved to the left.
731
732 However, on some platforms this is configurable, so that the same
733 operations described above will produce negative delta values (but with the
734 same magnitude). With the inverted property a wheel event consumer can
735 choose to always follow the direction of the wheel, regardless of the
736 system settings, but only for specific widgets. (One such use case could be
737 that the user is rotating the wheel in the same direction as a visual
738 Tumbler rotates. Another usecase is to make a slider handle follow the
739 direction of movement of fingers on a touchpad regardless of system
740 configuration.)
741
742 \note Many platforms provide no such information. On such platforms
743 \l inverted always returns false.
744*/
745
746#if QT_DEPRECATED_SINCE(5, 15)
747/*!
748 \fn Qt::Orientation QWheelEvent::orientation() const
749 \obsolete
750
751 Use angleDelta() instead.
752*/
753#endif
754
755#if QT_CONFIG(wheelevent)
756#if QT_DEPRECATED_SINCE(5, 15)
757/*!
758 \obsolete
759 This constructor has been deprecated.
760*/
761QWheelEvent::QWheelEvent(const QPointF &pos, int delta,
762 Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers,
763 Qt::Orientation orient)
764 : QInputEvent(Wheel, modifiers), p(pos), qt4D(delta), qt4O(orient), mouseState(buttons),
765 src(Qt::MouseEventNotSynthesized), invertedScrolling(false), ph(Qt::NoScrollPhase)
766{
767 g = QCursor::pos();
768 if (orient == Qt::Vertical)
769 angleD = QPoint(0, delta);
770 else
771 angleD = QPoint(delta, 0);
772}
773
774/*!
775 \obsolete
776 This constructor has been deprecated.
777*/
778QWheelEvent::QWheelEvent(const QPointF &pos, const QPointF& globalPos, int delta,
779 Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers,
780 Qt::Orientation orient)
781 : QInputEvent(Wheel, modifiers), p(pos), g(globalPos), qt4D(delta), qt4O(orient), mouseState(buttons),
782 src(Qt::MouseEventNotSynthesized), invertedScrolling(false), ph(Qt::NoScrollPhase)
783{
784 if (orient == Qt::Vertical)
785 angleD = QPoint(0, delta);
786 else
787 angleD = QPoint(delta, 0);
788}
789
790/*!
791 \obsolete
792 This constructor has been deprecated.
793*/
794QT_WARNING_PUSH
795QT_WARNING_DISABLE_DEPRECATED
796QWheelEvent::QWheelEvent(const QPointF &pos, const QPointF& globalPos,
797 QPoint pixelDelta, QPoint angleDelta, int qt4Delta, Qt::Orientation qt4Orientation,
798 Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers)
799 : QWheelEvent(pos, globalPos, pixelDelta, angleDelta, qt4Delta, qt4Orientation,
800 buttons, modifiers, Qt::NoScrollPhase)
801{}
802QT_WARNING_POP
803
804/*!
805 \obsolete
806 This constructor has been deprecated.
807*/
808QT_WARNING_PUSH
809QT_WARNING_DISABLE_DEPRECATED
810QWheelEvent::QWheelEvent(const QPointF &pos, const QPointF& globalPos,
811 QPoint pixelDelta, QPoint angleDelta, int qt4Delta, Qt::Orientation qt4Orientation,
812 Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers, Qt::ScrollPhase phase)
813 : QWheelEvent(pos, globalPos, pixelDelta, angleDelta, qt4Delta, qt4Orientation,
814 buttons, modifiers, phase, Qt::MouseEventNotSynthesized)
815{}
816QT_WARNING_POP
817
818/*!
819 \obsolete
820 This constructor has been deprecated.
821*/
822
823QT_WARNING_PUSH
824QT_WARNING_DISABLE_DEPRECATED
825QWheelEvent::QWheelEvent(const QPointF &pos, const QPointF& globalPos,
826 QPoint pixelDelta, QPoint angleDelta, int qt4Delta, Qt::Orientation qt4Orientation,
827 Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers, Qt::ScrollPhase phase, Qt::MouseEventSource source)
828 : QWheelEvent(pos, globalPos, pixelDelta, angleDelta, qt4Delta, qt4Orientation,
829 buttons, modifiers, phase, source, false)
830{}
831QT_WARNING_POP
832
833/*!
834 \obsolete
835 This constructor has been deprecated.
836*/
837QWheelEvent::QWheelEvent(const QPointF &pos, const QPointF& globalPos,
838 QPoint pixelDelta, QPoint angleDelta, int qt4Delta, Qt::Orientation qt4Orientation,
839 Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers, Qt::ScrollPhase phase, Qt::MouseEventSource source, bool inverted)
840 : QInputEvent(Wheel, modifiers), p(pos), g(globalPos), pixelD(pixelDelta),
841 angleD(angleDelta), qt4D(qt4Delta), qt4O(qt4Orientation), mouseState(buttons), src(source),
842 invertedScrolling(inverted), ph(phase)
843{}
844#endif // QT_DEPRECATED_SINCE(5, 15)
845
846/*!
847 Constructs a wheel event object.
848
849 \since 5.12
850 The \a pos provides the location of the mouse cursor
851 within the window. The position in global coordinates is specified
852 by \a globalPos.
853
854 \a pixelDelta contains the scrolling distance in pixels on screen, while
855 \a angleDelta contains the wheel rotation angle. \a pixelDelta is
856 optional and can be null.
857
858 The mouse and keyboard states at the time of the event are specified by
859 \a buttons and \a modifiers.
860
861 The scrolling phase of the event is specified by \a phase.
862
863 If the wheel event comes from a physical mouse wheel, \a source is set to
864 Qt::MouseEventNotSynthesized. If it comes from a gesture detected by the
865 operating system, or from a non-mouse hardware device, such that \a
866 pixelDelta is directly related to finger movement, \a source is set to
867 Qt::MouseEventSynthesizedBySystem. If it comes from Qt, source would be set
868 to Qt::MouseEventSynthesizedByQt.
869
870 If the system is configured to invert the delta values delivered with the
871 event (such as natural scrolling of the touchpad on macOS), \a inverted
872 should be \c true. Otherwise, \a inverted is \c false
873
874 \sa position(), globalPosition(), angleDelta(), pixelDelta(), phase(), inverted(), source()
875*/
876QWheelEvent::QWheelEvent(QPointF pos, QPointF globalPos, QPoint pixelDelta, QPoint angleDelta,
877 Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers, Qt::ScrollPhase phase,
878 bool inverted, Qt::MouseEventSource source)
879 : QInputEvent(Wheel, modifiers), p(pos), g(globalPos), pixelD(pixelDelta), angleD(angleDelta),
880 qt4O(qAbs(t: angleDelta.x()) > qAbs(t: angleDelta.y()) ? Qt::Horizontal : Qt::Vertical),
881 mouseState(buttons), src(source), invertedScrolling(inverted), ph(phase)
882{
883 qt4D = (qt4O == Qt::Horizontal ? angleDelta.x() : angleDelta.y());
884}
885
886/*!
887 \internal
888*/
889QWheelEvent::~QWheelEvent()
890{
891}
892#endif // QT_CONFIG(wheelevent)
893
894/*!
895 \fn QPoint QWheelEvent::pixelDelta() const
896
897 Returns the scrolling distance in pixels on screen. This value is
898 provided on platforms that support high-resolution pixel-based
899 delta values, such as \macos. The value should be used directly
900 to scroll content on screen.
901
902 Example:
903
904 \snippet code/src_gui_kernel_qevent.cpp 0
905
906 \note On platforms that support scrolling \l{phase()}{phases}, the delta may be null when:
907 \list
908 \li scrolling is about to begin, but the distance did not yet change (Qt::ScrollBegin),
909 \li or scrolling has ended and the distance did not change anymore (Qt::ScrollEnd).
910 \endlist
911 \note On X11 this value is driver specific and unreliable, use angleDelta() instead
912*/
913
914/*!
915 \fn QPoint QWheelEvent::angleDelta() const
916
917 Returns the relative amount that the wheel was rotated, in eighths of a
918 degree. A positive value indicates that the wheel was rotated forwards away
919 from the user; a negative value indicates that the wheel was rotated
920 backwards toward the user. \c angleDelta().y() provides the angle through
921 which the common vertical mouse wheel was rotated since the previous event.
922 \c angleDelta().x() provides the angle through which the horizontal mouse
923 wheel was rotated, if the mouse has a horizontal wheel; otherwise it stays
924 at zero. Some mice allow the user to tilt the wheel to perform horizontal
925 scrolling, and some touchpads support a horizontal scrolling gesture; that
926 will also appear in \c angleDelta().x().
927
928 Most mouse types work in steps of 15 degrees, in which case the
929 delta value is a multiple of 120; i.e., 120 units * 1/8 = 15 degrees.
930
931 However, some mice have finer-resolution wheels and send delta values
932 that are less than 120 units (less than 15 degrees). To support this
933 possibility, you can either cumulatively add the delta values from events
934 until the value of 120 is reached, then scroll the widget, or you can
935 partially scroll the widget in response to each wheel event. But to
936 provide a more native feel, you should prefer \l pixelDelta() on platforms
937 where it's available.
938
939 Example:
940
941 \snippet code/src_gui_kernel_qevent.cpp 0
942
943 \note On platforms that support scrolling \l{phase()}{phases}, the delta may be null when:
944 \list
945 \li scrolling is about to begin, but the distance did not yet change (Qt::ScrollBegin),
946 \li or scrolling has ended and the distance did not change anymore (Qt::ScrollEnd).
947 \endlist
948
949 \sa pixelDelta()
950*/
951
952/*!
953 \fn QPoint QWheelEvent::position() const
954 \since 5.14
955
956 Returns the position of the mouse cursor relative to the widget
957 that received the event.
958
959 If you move your widgets around in response to mouse events,
960 use globalPosition() instead of this function.
961
962 \sa globalPosition()
963*/
964
965/*!
966 \fn QPoint QWheelEvent::globalPosition() const
967
968 Returns the global position of the mouse pointer \e{at the time
969 of the event}. This is important on asynchronous window systems
970 such as X11; whenever you move your widgets around in response to
971 mouse events, globalPosition() can differ a lot from the current
972 cursor position returned by QCursor::pos().
973
974 \sa position()
975*/
976
977#if QT_DEPRECATED_SINCE(5, 15)
978/*!
979 \fn int QWheelEvent::delta() const
980 \obsolete
981
982 This function has been deprecated, use pixelDelta() or angleDelta() instead.
983*/
984
985/*!
986 \fn QPoint QWheelEvent::pos() const
987 \obsolete
988
989 This function has been deprecated, use position() instead.
990*/
991
992/*!
993 \fn int QWheelEvent::x() const
994 \obsolete
995
996 This function has been deprecated, use position() instead.
997*/
998
999/*!
1000 \fn int QWheelEvent::y() const
1001 \obsolete
1002
1003 This function has been deprecated, use position() instead.
1004*/
1005
1006
1007/*!
1008 \fn QPoint QWheelEvent::globalPos() const
1009 \obsolete
1010
1011 This function has been deprecated, use globalPosition() instead.
1012*/
1013
1014/*!
1015 \fn int QWheelEvent::globalX() const
1016 \obsolete
1017
1018 This function has been deprecated, use globalPosition() instead.
1019*/
1020
1021/*!
1022 \fn int QWheelEvent::globalY() const
1023 \obsolete
1024
1025 This function has been deprecated, use globalPosition() instead.
1026*/
1027
1028/*!
1029 \fn const QPointF &QWheelEvent::posF() const
1030 \obsolete
1031
1032 This function has been deprecated, use position() instead.
1033*/
1034
1035/*!
1036 \fn const QPointF &QWheelEvent::globalPosF() const
1037 \obsolete
1038
1039 This function has been deprecated, use globalPosition() instead.
1040*/
1041#endif
1042
1043/*!
1044 \fn Qt::ScrollPhase QWheelEvent::phase() const
1045 \since 5.2
1046
1047 Returns the scrolling phase of this wheel event.
1048
1049 \note The Qt::ScrollBegin and Qt::ScrollEnd phases are currently
1050 supported only on \macos.
1051*/
1052
1053
1054/*!
1055 \class QKeyEvent
1056 \brief The QKeyEvent class describes a key event.
1057
1058 \ingroup events
1059 \inmodule QtGui
1060
1061 Key events are sent to the widget with keyboard input focus
1062 when keys are pressed or released.
1063
1064 A key event contains a special accept flag that indicates whether
1065 the receiver will handle the key event. This flag is set by default
1066 for QEvent::KeyPress and QEvent::KeyRelease, so there is no need to
1067 call accept() when acting on a key event. For QEvent::ShortcutOverride
1068 the receiver needs to explicitly accept the event to trigger the override.
1069 Calling ignore() on a key event will propagate it to the parent widget.
1070 The event is propagated up the parent widget chain until a widget
1071 accepts it or an event filter consumes it.
1072
1073 The QWidget::setEnabled() function can be used to enable or disable
1074 mouse and keyboard events for a widget.
1075
1076 The event handlers QWidget::keyPressEvent(), QWidget::keyReleaseEvent(),
1077 QGraphicsItem::keyPressEvent() and QGraphicsItem::keyReleaseEvent()
1078 receive key events.
1079
1080 \sa QFocusEvent, QWidget::grabKeyboard()
1081*/
1082
1083/*!
1084 Constructs a key event object.
1085
1086 The \a type parameter must be QEvent::KeyPress, QEvent::KeyRelease,
1087 or QEvent::ShortcutOverride.
1088
1089 Int \a key is the code for the Qt::Key that the event loop should listen
1090 for. If \a key is 0, the event is not a result of a known key; for
1091 example, it may be the result of a compose sequence or keyboard macro.
1092 The \a modifiers holds the keyboard modifiers, and the given \a text
1093 is the Unicode text that the key generated. If \a autorep is true,
1094 isAutoRepeat() will be true. \a count is the number of keys involved
1095 in the event.
1096*/
1097QKeyEvent::QKeyEvent(Type type, int key, Qt::KeyboardModifiers modifiers, const QString& text,
1098 bool autorep, ushort count)
1099 : QInputEvent(type, modifiers), txt(text), k(key),
1100 nScanCode(0), nVirtualKey(0), nModifiers(0),
1101 c(count), autor(autorep)
1102{
1103 if (type == QEvent::ShortcutOverride)
1104 ignore();
1105}
1106
1107/*!
1108 Constructs a key event object.
1109
1110 The \a type parameter must be QEvent::KeyPress, QEvent::KeyRelease,
1111 or QEvent::ShortcutOverride.
1112
1113 Int \a key is the code for the Qt::Key that the event loop should listen
1114 for. If \a key is 0, the event is not a result of a known key; for
1115 example, it may be the result of a compose sequence or keyboard macro.
1116 The \a modifiers holds the keyboard modifiers, and the given \a text
1117 is the Unicode text that the key generated. If \a autorep is true,
1118 isAutoRepeat() will be true. \a count is the number of keys involved
1119 in the event.
1120
1121 In addition to the normal key event data, also contains \a nativeScanCode,
1122 \a nativeVirtualKey and \a nativeModifiers. This extra data is used by the
1123 shortcut system, to determine which shortcuts to trigger.
1124*/
1125QKeyEvent::QKeyEvent(Type type, int key, Qt::KeyboardModifiers modifiers,
1126 quint32 nativeScanCode, quint32 nativeVirtualKey, quint32 nativeModifiers,
1127 const QString &text, bool autorep, ushort count)
1128 : QInputEvent(type, modifiers), txt(text), k(key),
1129 nScanCode(nativeScanCode), nVirtualKey(nativeVirtualKey), nModifiers(nativeModifiers),
1130 c(count), autor(autorep)
1131{
1132 if (type == QEvent::ShortcutOverride)
1133 ignore();
1134}
1135
1136
1137/*!
1138 \internal
1139*/
1140QKeyEvent::~QKeyEvent()
1141{
1142}
1143
1144/*!
1145 \fn quint32 QKeyEvent::nativeScanCode() const
1146 \since 4.2
1147
1148 Returns the native scan code of the key event. If the key event
1149 does not contain this data 0 is returned.
1150
1151 Note: The native scan code may be 0, even if the key event contains
1152 extended information.
1153
1154 Note: On \macos, this function is not useful, because there is no
1155 way to get the scan code from the system APIs. The function always
1156 returns 1 (or 0 in the case explained above).
1157*/
1158
1159/*!
1160 \fn quint32 QKeyEvent::nativeVirtualKey() const
1161 \since 4.2
1162
1163 Returns the native virtual key, or key sym of the key event.
1164 If the key event does not contain this data 0 is returned.
1165
1166 Note: The native virtual key may be 0, even if the key event contains extended information.
1167*/
1168
1169/*!
1170 \fn quint32 QKeyEvent::nativeModifiers() const
1171 \since 4.2
1172
1173 Returns the native modifiers of a key event.
1174 If the key event does not contain this data 0 is returned.
1175
1176 Note: The native modifiers may be 0, even if the key event contains extended information.
1177*/
1178
1179/*!
1180 \fn int QKeyEvent::key() const
1181
1182 Returns the code of the key that was pressed or released.
1183
1184 See \l Qt::Key for the list of keyboard codes. These codes are
1185 independent of the underlying window system. Note that this
1186 function does not distinguish between capital and non-capital
1187 letters, use the text() function (returning the Unicode text the
1188 key generated) for this purpose.
1189
1190 A value of either 0 or Qt::Key_unknown means that the event is not
1191 the result of a known key; for example, it may be the result of
1192 a compose sequence, a keyboard macro, or due to key event
1193 compression.
1194
1195 \sa Qt::WA_KeyCompression
1196*/
1197
1198/*!
1199 \fn QString QKeyEvent::text() const
1200
1201 Returns the Unicode text that this key generated.
1202
1203 Return values when modifier keys such as
1204 Shift, Control, Alt, and Meta are pressed
1205 differ among platforms and could return an empty string.
1206
1207 \note \l key() will always return a valid value,
1208 independent of modifier keys.
1209
1210 \sa Qt::WA_KeyCompression
1211*/
1212
1213/*!
1214 Returns the keyboard modifier flags that existed immediately
1215 after the event occurred.
1216
1217 \warning This function cannot always be trusted. The user can
1218 confuse it by pressing both \uicontrol{Shift} keys simultaneously and
1219 releasing one of them, for example.
1220
1221 \sa QGuiApplication::keyboardModifiers()
1222*/
1223
1224Qt::KeyboardModifiers QKeyEvent::modifiers() const
1225{
1226 if (key() == Qt::Key_Shift)
1227 return Qt::KeyboardModifiers(QInputEvent::modifiers()^Qt::ShiftModifier);
1228 if (key() == Qt::Key_Control)
1229 return Qt::KeyboardModifiers(QInputEvent::modifiers()^Qt::ControlModifier);
1230 if (key() == Qt::Key_Alt)
1231 return Qt::KeyboardModifiers(QInputEvent::modifiers()^Qt::AltModifier);
1232 if (key() == Qt::Key_Meta)
1233 return Qt::KeyboardModifiers(QInputEvent::modifiers()^Qt::MetaModifier);
1234 if (key() == Qt::Key_AltGr)
1235 return Qt::KeyboardModifiers(QInputEvent::modifiers()^Qt::GroupSwitchModifier);
1236 return QInputEvent::modifiers();
1237}
1238
1239#ifndef QT_NO_SHORTCUT
1240/*!
1241 \fn bool QKeyEvent::matches(QKeySequence::StandardKey key) const
1242 \since 4.2
1243
1244 Returns \c true if the key event matches the given standard \a key;
1245 otherwise returns \c false.
1246*/
1247bool QKeyEvent::matches(QKeySequence::StandardKey matchKey) const
1248{
1249 //The keypad and group switch modifier should not make a difference
1250 uint searchkey = (modifiers() | key()) & ~(Qt::KeypadModifier | Qt::GroupSwitchModifier);
1251
1252 const QList<QKeySequence> bindings = QKeySequence::keyBindings(key: matchKey);
1253 return bindings.contains(t: QKeySequence(searchkey));
1254}
1255#endif // QT_NO_SHORTCUT
1256
1257
1258/*!
1259 \fn bool QKeyEvent::isAutoRepeat() const
1260
1261 Returns \c true if this event comes from an auto-repeating key;
1262 returns \c false if it comes from an initial key press.
1263
1264 Note that if the event is a multiple-key compressed event that is
1265 partly due to auto-repeat, this function could return either true
1266 or false indeterminately.
1267*/
1268
1269/*!
1270 \fn int QKeyEvent::count() const
1271
1272 Returns the number of keys involved in this event. If text()
1273 is not empty, this is simply the length of the string.
1274
1275 \sa Qt::WA_KeyCompression
1276*/
1277
1278/*!
1279 \class QFocusEvent
1280 \brief The QFocusEvent class contains event parameters for widget focus
1281 events.
1282 \inmodule QtGui
1283
1284 \ingroup events
1285
1286 Focus events are sent to widgets when the keyboard input focus
1287 changes. Focus events occur due to mouse actions, key presses
1288 (such as \uicontrol{Tab} or \uicontrol{Backtab}), the window system, popup
1289 menus, keyboard shortcuts, or other application-specific reasons.
1290 The reason for a particular focus event is returned by reason()
1291 in the appropriate event handler.
1292
1293 The event handlers QWidget::focusInEvent(),
1294 QWidget::focusOutEvent(), QGraphicsItem::focusInEvent and
1295 QGraphicsItem::focusOutEvent() receive focus events.
1296
1297 \sa QWidget::setFocus(), QWidget::setFocusPolicy(), {Keyboard Focus in Widgets}
1298*/
1299
1300/*!
1301 Constructs a focus event object.
1302
1303 The \a type parameter must be either QEvent::FocusIn or
1304 QEvent::FocusOut. The \a reason describes the cause of the change
1305 in focus.
1306*/
1307QFocusEvent::QFocusEvent(Type type, Qt::FocusReason reason)
1308 : QEvent(type), m_reason(reason)
1309{}
1310
1311/*!
1312 \internal
1313*/
1314QFocusEvent::~QFocusEvent()
1315{
1316}
1317
1318/*!
1319 Returns the reason for this focus event.
1320 */
1321Qt::FocusReason QFocusEvent::reason() const
1322{
1323 return m_reason;
1324}
1325
1326/*!
1327 \fn bool QFocusEvent::gotFocus() const
1328
1329 Returns \c true if type() is QEvent::FocusIn; otherwise returns
1330 false.
1331*/
1332
1333/*!
1334 \fn bool QFocusEvent::lostFocus() const
1335
1336 Returns \c true if type() is QEvent::FocusOut; otherwise returns
1337 false.
1338*/
1339
1340
1341/*!
1342 \class QPaintEvent
1343 \brief The QPaintEvent class contains event parameters for paint events.
1344 \inmodule QtGui
1345
1346 \ingroup events
1347
1348 Paint events are sent to widgets that need to update themselves,
1349 for instance when part of a widget is exposed because a covering
1350 widget was moved.
1351
1352 The event contains a region() that needs to be updated, and a
1353 rect() that is the bounding rectangle of that region. Both are
1354 provided because many widgets cannot make much use of region(),
1355 and rect() can be much faster than region().boundingRect().
1356
1357 \section1 Automatic Clipping
1358
1359 Painting is clipped to region() during the processing of a paint
1360 event. This clipping is performed by Qt's paint system and is
1361 independent of any clipping that may be applied to a QPainter used to
1362 draw on the paint device.
1363
1364 As a result, the value returned by QPainter::clipRegion() on
1365 a newly-constructed QPainter will not reflect the clip region that is
1366 used by the paint system.
1367
1368 \sa QPainter, QWidget::update(), QWidget::repaint(),
1369 QWidget::paintEvent()
1370*/
1371
1372/*!
1373 Constructs a paint event object with the region that needs to
1374 be updated. The region is specified by \a paintRegion.
1375*/
1376QPaintEvent::QPaintEvent(const QRegion& paintRegion)
1377 : QEvent(Paint), m_rect(paintRegion.boundingRect()), m_region(paintRegion), m_erased(false)
1378{}
1379
1380/*!
1381 Constructs a paint event object with the rectangle that needs
1382 to be updated. The region is specified by \a paintRect.
1383*/
1384QPaintEvent::QPaintEvent(const QRect &paintRect)
1385 : QEvent(Paint), m_rect(paintRect),m_region(paintRect), m_erased(false)
1386{}
1387
1388
1389/*!
1390 \internal
1391*/
1392QPaintEvent::~QPaintEvent()
1393{
1394}
1395
1396/*!
1397 \fn const QRect &QPaintEvent::rect() const
1398
1399 Returns the rectangle that needs to be updated.
1400
1401 \sa region(), QPainter::setClipRect()
1402*/
1403
1404/*!
1405 \fn const QRegion &QPaintEvent::region() const
1406
1407 Returns the region that needs to be updated.
1408
1409 \sa rect(), QPainter::setClipRegion()
1410*/
1411
1412
1413/*!
1414 \class QMoveEvent
1415 \brief The QMoveEvent class contains event parameters for move events.
1416 \inmodule QtGui
1417
1418 \ingroup events
1419
1420 Move events are sent to widgets that have been moved to a new
1421 position relative to their parent.
1422
1423 The event handler QWidget::moveEvent() receives move events.
1424
1425 \sa QWidget::move(), QWidget::setGeometry()
1426*/
1427
1428/*!
1429 Constructs a move event with the new and old widget positions,
1430 \a pos and \a oldPos respectively.
1431*/
1432QMoveEvent::QMoveEvent(const QPoint &pos, const QPoint &oldPos)
1433 : QEvent(Move), p(pos), oldp(oldPos)
1434{}
1435
1436/*!
1437 \internal
1438*/
1439QMoveEvent::~QMoveEvent()
1440{
1441}
1442
1443/*!
1444 \fn const QPoint &QMoveEvent::pos() const
1445
1446 Returns the new position of the widget. This excludes the window
1447 frame for top level widgets.
1448*/
1449
1450/*!
1451 \fn const QPoint &QMoveEvent::oldPos() const
1452
1453 Returns the old position of the widget.
1454*/
1455
1456/*!
1457 \class QExposeEvent
1458 \since 5.0
1459 \brief The QExposeEvent class contains event parameters for expose events.
1460 \inmodule QtGui
1461
1462 \ingroup events
1463
1464 Expose events are sent to windows when an area of the window is invalidated,
1465 for example when window exposure in the windowing system changes.
1466
1467 A Window with a client area that is completely covered by another window, or
1468 is otherwise not visible may be considered obscured by Qt and may in such
1469 cases not receive expose events.
1470
1471 The event handler QWindow::exposeEvent() receives expose events.
1472*/
1473
1474/*!
1475 Constructs an expose event for the given \a exposeRegion which must be
1476 in local coordinates.
1477*/
1478QExposeEvent::QExposeEvent(const QRegion &exposeRegion)
1479 : QEvent(Expose)
1480 , rgn(exposeRegion)
1481{
1482}
1483
1484/*!
1485 \internal
1486*/
1487QExposeEvent::~QExposeEvent()
1488{
1489}
1490
1491/*!
1492 \class QPlatformSurfaceEvent
1493 \since 5.5
1494 \brief The QPlatformSurfaceEvent class is used to notify about native platform surface events.
1495 \inmodule QtGui
1496
1497 \ingroup events
1498
1499 Platform window events are synchronously sent to windows and offscreen surfaces when their
1500 underlying native surfaces are created or are about to be destroyed.
1501
1502 Applications can respond to these events to know when the underlying platform
1503 surface exists.
1504*/
1505
1506/*!
1507 \enum QPlatformSurfaceEvent::SurfaceEventType
1508
1509 This enum describes the type of platform surface event. The possible types are:
1510
1511 \value SurfaceCreated The underlying native surface has been created
1512 \value SurfaceAboutToBeDestroyed The underlying native surface will be destroyed immediately after this event
1513
1514 The \c SurfaceAboutToBeDestroyed event type is useful as a means of stopping rendering to
1515 a platform window before it is destroyed.
1516*/
1517
1518/*!
1519 \fn QPlatformSurfaceEvent::SurfaceEventType QPlatformSurfaceEvent::surfaceEventType() const
1520
1521 Returns the specific type of platform surface event.
1522*/
1523
1524/*!
1525 Constructs a platform surface event for the given \a surfaceEventType.
1526*/
1527QPlatformSurfaceEvent::QPlatformSurfaceEvent(SurfaceEventType surfaceEventType)
1528 : QEvent(PlatformSurface)
1529 , m_surfaceEventType(surfaceEventType)
1530{
1531}
1532
1533/*!
1534 \internal
1535*/
1536QPlatformSurfaceEvent::~QPlatformSurfaceEvent()
1537{
1538}
1539
1540/*!
1541 \fn const QRegion &QExposeEvent::region() const
1542
1543 Returns the window area that has been exposed. The region is given in local coordinates.
1544*/
1545
1546/*!
1547 \class QResizeEvent
1548 \brief The QResizeEvent class contains event parameters for resize events.
1549 \inmodule QtGui
1550
1551 \ingroup events
1552
1553 Resize events are sent to widgets that have been resized.
1554
1555 The event handler QWidget::resizeEvent() receives resize events.
1556
1557 \sa QWidget::resize(), QWidget::setGeometry()
1558*/
1559
1560/*!
1561 Constructs a resize event with the new and old widget sizes, \a
1562 size and \a oldSize respectively.
1563*/
1564QResizeEvent::QResizeEvent(const QSize &size, const QSize &oldSize)
1565 : QEvent(Resize), s(size), olds(oldSize)
1566{}
1567
1568/*!
1569 \internal
1570*/
1571QResizeEvent::~QResizeEvent()
1572{
1573}
1574
1575/*!
1576 \fn const QSize &QResizeEvent::size() const
1577
1578 Returns the new size of the widget. This is the same as
1579 QWidget::size().
1580*/
1581
1582/*!
1583 \fn const QSize &QResizeEvent::oldSize() const
1584
1585 Returns the old size of the widget.
1586*/
1587
1588
1589/*!
1590 \class QCloseEvent
1591 \brief The QCloseEvent class contains parameters that describe a close event.
1592
1593 \ingroup events
1594 \inmodule QtGui
1595
1596 Close events are sent to widgets that the user wants to close,
1597 usually by choosing "Close" from the window menu, or by clicking
1598 the \uicontrol{X} title bar button. They are also sent when you call
1599 QWidget::close() to close a widget programmatically.
1600
1601 Close events contain a flag that indicates whether the receiver
1602 wants the widget to be closed or not. When a widget accepts the
1603 close event, it is hidden (and destroyed if it was created with
1604 the Qt::WA_DeleteOnClose flag). If it refuses to accept the close
1605 event nothing happens. (Under X11 it is possible that the window
1606 manager will forcibly close the window; but at the time of writing
1607 we are not aware of any window manager that does this.)
1608
1609 The event handler QWidget::closeEvent() receives close events. The
1610 default implementation of this event handler accepts the close
1611 event. If you do not want your widget to be hidden, or want some
1612 special handling, you should reimplement the event handler and
1613 ignore() the event.
1614
1615 The \l{mainwindows/application#close event handler}{closeEvent() in the
1616 Application example} shows a close event handler that
1617 asks whether to save a document before closing.
1618
1619 If you want the widget to be deleted when it is closed, create it
1620 with the Qt::WA_DeleteOnClose flag. This is very useful for
1621 independent top-level windows in a multi-window application.
1622
1623 \l{QObject}s emits the \l{QObject::destroyed()}{destroyed()}
1624 signal when they are deleted.
1625
1626 If the last top-level window is closed, the
1627 QGuiApplication::lastWindowClosed() signal is emitted.
1628
1629 The isAccepted() function returns \c true if the event's receiver has
1630 agreed to close the widget; call accept() to agree to close the
1631 widget and call ignore() if the receiver of this event does not
1632 want the widget to be closed.
1633
1634 \sa QWidget::close(), QWidget::hide(), QObject::destroyed(),
1635 QCoreApplication::exec(), QCoreApplication::quit(),
1636 QGuiApplication::lastWindowClosed()
1637*/
1638
1639/*!
1640 Constructs a close event object.
1641
1642 \sa accept()
1643*/
1644QCloseEvent::QCloseEvent()
1645 : QEvent(Close)
1646{}
1647
1648/*! \internal
1649*/
1650QCloseEvent::~QCloseEvent()
1651{
1652}
1653
1654/*!
1655 \class QIconDragEvent
1656 \brief The QIconDragEvent class indicates that a main icon drag has begun.
1657 \inmodule QtGui
1658
1659 \ingroup events
1660
1661 Icon drag events are sent to widgets when the main icon of a window
1662 has been dragged away. On \macos, this happens when the proxy
1663 icon of a window is dragged off the title bar.
1664
1665 It is normal to begin using drag and drop in response to this
1666 event.
1667
1668 \sa {Drag and Drop}, QMimeData, QDrag
1669*/
1670
1671/*!
1672 Constructs an icon drag event object with the accept flag set to
1673 false.
1674
1675 \sa accept()
1676*/
1677QIconDragEvent::QIconDragEvent()
1678 : QEvent(IconDrag)
1679{ ignore(); }
1680
1681/*! \internal */
1682QIconDragEvent::~QIconDragEvent()
1683{
1684}
1685
1686/*!
1687 \class QContextMenuEvent
1688 \brief The QContextMenuEvent class contains parameters that describe a context menu event.
1689 \inmodule QtGui
1690
1691 \ingroup events
1692
1693 Context menu events are sent to widgets when a user performs
1694 an action associated with opening a context menu.
1695 The actions required to open context menus vary between platforms;
1696 for example, on Windows, pressing the menu button or clicking the
1697 right mouse button will cause this event to be sent.
1698
1699 When this event occurs it is customary to show a QMenu with a
1700 context menu, if this is relevant to the context.
1701
1702 Context menu events contain a special accept flag that indicates
1703 whether the receiver accepted the event. If the event handler does
1704 not accept the event then, if possible, whatever triggered the event will be
1705 handled as a regular input event.
1706*/
1707
1708#ifndef QT_NO_CONTEXTMENU
1709/*!
1710 Constructs a context menu event object with the accept parameter
1711 flag set to false.
1712
1713 The \a reason parameter must be QContextMenuEvent::Mouse or
1714 QContextMenuEvent::Keyboard.
1715
1716 The \a pos parameter specifies the mouse position relative to the
1717 receiving widget. \a globalPos is the mouse position in absolute
1718 coordinates.
1719*/
1720QContextMenuEvent::QContextMenuEvent(Reason reason, const QPoint &pos, const QPoint &globalPos)
1721 : QContextMenuEvent(reason, pos, globalPos, Qt::NoModifier)
1722{}
1723
1724/*!
1725 Constructs a context menu event object with the accept parameter
1726 flag set to false.
1727
1728 The \a reason parameter must be QContextMenuEvent::Mouse or
1729 QContextMenuEvent::Keyboard.
1730
1731 The \a pos parameter specifies the mouse position relative to the
1732 receiving widget. \a globalPos is the mouse position in absolute
1733 coordinates. The \a modifiers holds the keyboard modifiers.
1734*/
1735QContextMenuEvent::QContextMenuEvent(Reason reason, const QPoint &pos, const QPoint &globalPos,
1736 Qt::KeyboardModifiers modifiers)
1737 : QInputEvent(ContextMenu, modifiers), p(pos), gp(globalPos), reas(reason)
1738{}
1739
1740
1741/*! \internal */
1742QContextMenuEvent::~QContextMenuEvent()
1743{
1744}
1745/*!
1746 Constructs a context menu event object with the accept parameter
1747 flag set to false.
1748
1749 The \a reason parameter must be QContextMenuEvent::Mouse or
1750 QContextMenuEvent::Keyboard.
1751
1752 The \a pos parameter specifies the mouse position relative to the
1753 receiving widget.
1754
1755 The globalPos() is initialized to QCursor::pos(), which may not be
1756 appropriate. Use the other constructor to specify the global
1757 position explicitly.
1758*/
1759QContextMenuEvent::QContextMenuEvent(Reason reason, const QPoint &pos)
1760 : QInputEvent(ContextMenu), p(pos), reas(reason)
1761{
1762#ifndef QT_NO_CURSOR
1763 gp = QCursor::pos();
1764#endif
1765}
1766
1767/*!
1768 \fn const QPoint &QContextMenuEvent::pos() const
1769
1770 Returns the position of the mouse pointer relative to the widget
1771 that received the event.
1772
1773 \sa x(), y(), globalPos()
1774*/
1775
1776/*!
1777 \fn int QContextMenuEvent::x() const
1778
1779 Returns the x position of the mouse pointer, relative to the
1780 widget that received the event.
1781
1782 \sa y(), pos()
1783*/
1784
1785/*!
1786 \fn int QContextMenuEvent::y() const
1787
1788 Returns the y position of the mouse pointer, relative to the
1789 widget that received the event.
1790
1791 \sa x(), pos()
1792*/
1793
1794/*!
1795 \fn const QPoint &QContextMenuEvent::globalPos() const
1796
1797 Returns the global position of the mouse pointer at the time of
1798 the event.
1799
1800 \sa x(), y(), pos()
1801*/
1802
1803/*!
1804 \fn int QContextMenuEvent::globalX() const
1805
1806 Returns the global x position of the mouse pointer at the time of
1807 the event.
1808
1809 \sa globalY(), globalPos()
1810*/
1811
1812/*!
1813 \fn int QContextMenuEvent::globalY() const
1814
1815 Returns the global y position of the mouse pointer at the time of
1816 the event.
1817
1818 \sa globalX(), globalPos()
1819*/
1820#endif // QT_NO_CONTEXTMENU
1821
1822/*!
1823 \enum QContextMenuEvent::Reason
1824
1825 This enum describes the reason why the event was sent.
1826
1827 \value Mouse The mouse caused the event to be sent. Normally this
1828 means the right mouse button was clicked, but this is platform
1829 dependent.
1830
1831 \value Keyboard The keyboard caused this event to be sent. On
1832 Windows, this means the menu button was pressed.
1833
1834 \value Other The event was sent by some other means (i.e. not by
1835 the mouse or keyboard).
1836*/
1837
1838
1839/*!
1840 \fn QContextMenuEvent::Reason QContextMenuEvent::reason() const
1841
1842 Returns the reason for this context event.
1843*/
1844
1845
1846/*!
1847 \class QInputMethodEvent
1848 \brief The QInputMethodEvent class provides parameters for input method events.
1849 \inmodule QtGui
1850
1851 \ingroup events
1852
1853 Input method events are sent to widgets when an input method is
1854 used to enter text into a widget. Input methods are widely used
1855 to enter text for languages with non-Latin alphabets.
1856
1857 Note that when creating custom text editing widgets, the
1858 Qt::WA_InputMethodEnabled window attribute must be set explicitly
1859 (using the QWidget::setAttribute() function) in order to receive
1860 input method events.
1861
1862 The events are of interest to authors of keyboard entry widgets
1863 who want to be able to correctly handle languages with complex
1864 character input. Text input in such languages is usually a three
1865 step process:
1866
1867 \list 1
1868 \li \b{Starting to Compose}
1869
1870 When the user presses the first key on a keyboard, an input
1871 context is created. This input context will contain a string
1872 of the typed characters.
1873
1874 \li \b{Composing}
1875
1876 With every new key pressed, the input method will try to create a
1877 matching string for the text typed so far called preedit
1878 string. While the input context is active, the user can only move
1879 the cursor inside the string belonging to this input context.
1880
1881 \li \b{Completing}
1882
1883 At some point, the user will activate a user interface component
1884 (perhaps using a particular key) where they can choose from a
1885 number of strings matching the text they have typed so far. The
1886 user can either confirm their choice cancel the input; in either
1887 case the input context will be closed.
1888 \endlist
1889
1890 QInputMethodEvent models these three stages, and transfers the
1891 information needed to correctly render the intermediate result. A
1892 QInputMethodEvent has two main parameters: preeditString() and
1893 commitString(). The preeditString() parameter gives the currently
1894 active preedit string. The commitString() parameter gives a text
1895 that should get added to (or replace parts of) the text of the
1896 editor widget. It usually is a result of the input operations and
1897 has to be inserted to the widgets text directly before the preedit
1898 string.
1899
1900 If the commitString() should replace parts of the of the text in
1901 the editor, replacementLength() will contain the number of
1902 characters to be replaced. replacementStart() contains the position
1903 at which characters are to be replaced relative from the start of
1904 the preedit string.
1905
1906 A number of attributes control the visual appearance of the
1907 preedit string (the visual appearance of text outside the preedit
1908 string is controlled by the widget only). The AttributeType enum
1909 describes the different attributes that can be set.
1910
1911 A class implementing QWidget::inputMethodEvent() or
1912 QGraphicsItem::inputMethodEvent() should at least understand and
1913 honor the \l TextFormat and \l Cursor attributes.
1914
1915 Since input methods need to be able to query certain properties
1916 from the widget or graphics item, subclasses must also implement
1917 QWidget::inputMethodQuery() and QGraphicsItem::inputMethodQuery(),
1918 respectively.
1919
1920 When receiving an input method event, the text widget has to performs the
1921 following steps:
1922
1923 \list 1
1924 \li If the widget has selected text, the selected text should get
1925 removed.
1926
1927 \li Remove the text starting at replacementStart() with length
1928 replacementLength() and replace it by the commitString(). If
1929 replacementLength() is 0, replacementStart() gives the insertion
1930 position for the commitString().
1931
1932 When doing replacement the area of the preedit
1933 string is ignored, thus a replacement starting at -1 with a length
1934 of 2 will remove the last character before the preedit string and
1935 the first character afterwards, and insert the commit string
1936 directly before the preedit string.
1937
1938 If the widget implements undo/redo, this operation gets added to
1939 the undo stack.
1940
1941 \li If there is no current preedit string, insert the
1942 preeditString() at the current cursor position; otherwise replace
1943 the previous preeditString with the one received from this event.
1944
1945 If the widget implements undo/redo, the preeditString() should not
1946 influence the undo/redo stack in any way.
1947
1948 The widget should examine the list of attributes to apply to the
1949 preedit string. It has to understand at least the TextFormat and
1950 Cursor attributes and render them as specified.
1951 \endlist
1952
1953 \sa QInputMethod
1954*/
1955
1956/*!
1957 \enum QInputMethodEvent::AttributeType
1958
1959 \value TextFormat
1960 A QTextCharFormat for the part of the preedit string specified by
1961 start and length. value contains a QVariant of type QTextFormat
1962 specifying rendering of this part of the preedit string. There
1963 should be at most one format for every part of the preedit
1964 string. If several are specified for any character in the string the
1965 behaviour is undefined. A conforming implementation has to at least
1966 honor the backgroundColor, textColor and fontUnderline properties
1967 of the format.
1968
1969 \value Cursor If set, a cursor should be shown inside the preedit
1970 string at position start. The length variable determines whether
1971 the cursor is visible or not. If the length is 0 the cursor is
1972 invisible. If value is a QVariant of type QColor this color will
1973 be used for rendering the cursor, otherwise the color of the
1974 surrounding text will be used. There should be at most one Cursor
1975 attribute per event. If several are specified the behaviour is
1976 undefined.
1977
1978 \value Language
1979 The variant contains a QLocale object specifying the language of a
1980 certain part of the preedit string. There should be at most one
1981 language set for every part of the preedit string. If several are
1982 specified for any character in the string the behavior is undefined.
1983
1984 \value Ruby
1985 The ruby text for a part of the preedit string. There should be at
1986 most one ruby text set for every part of the preedit string. If
1987 several are specified for any character in the string the behaviour
1988 is undefined.
1989
1990 \value Selection
1991 If set, the edit cursor should be moved to the specified position
1992 in the editor text contents. In contrast with \c Cursor, this
1993 attribute does not work on the preedit text, but on the surrounding
1994 text. The cursor will be moved after the commit string has been
1995 committed, and the preedit string will be located at the new edit
1996 position.
1997 The start position specifies the new position and the length
1998 variable can be used to set a selection starting from that point.
1999 The value is unused.
2000
2001 \sa Attribute
2002*/
2003
2004/*!
2005 \class QInputMethodEvent::Attribute
2006 \inmodule QtGui
2007 \brief The QInputMethodEvent::Attribute class stores an input method attribute.
2008*/
2009
2010/*!
2011 \fn QInputMethodEvent::Attribute::Attribute(AttributeType type, int start, int length, QVariant value)
2012
2013 Constructs an input method attribute. \a type specifies the type
2014 of attribute, \a start and \a length the position of the
2015 attribute, and \a value the value of the attribute.
2016*/
2017
2018/*!
2019 \fn QInputMethodEvent::Attribute::Attribute(AttributeType type, int start, int length)
2020 \overload
2021 \since 5.7
2022
2023 Constructs an input method attribute with no value. \a type
2024 specifies the type of attribute, and \a start and \a length
2025 the position of the attribute.
2026*/
2027
2028/*!
2029 Constructs an event of type QEvent::InputMethod. The
2030 attributes(), preeditString(), commitString(), replacementStart(),
2031 and replacementLength() are initialized to default values.
2032
2033 \sa setCommitString()
2034*/
2035QInputMethodEvent::QInputMethodEvent()
2036 : QEvent(QEvent::InputMethod), replace_from(0), replace_length(0)
2037{
2038}
2039
2040/*!
2041 Constructs an event of type QEvent::InputMethod. The
2042 preedit text is set to \a preeditText, the attributes to
2043 \a attributes.
2044
2045 The commitString(), replacementStart(), and replacementLength()
2046 values can be set using setCommitString().
2047
2048 \sa preeditString(), attributes()
2049*/
2050QInputMethodEvent::QInputMethodEvent(const QString &preeditText, const QList<Attribute> &attributes)
2051 : QEvent(QEvent::InputMethod), preedit(preeditText), attrs(attributes),
2052 replace_from(0), replace_length(0)
2053{
2054}
2055
2056/*!
2057 Constructs a copy of \a other.
2058*/
2059QInputMethodEvent::QInputMethodEvent(const QInputMethodEvent &other)
2060 : QEvent(QEvent::InputMethod), preedit(other.preedit), attrs(other.attrs),
2061 commit(other.commit), replace_from(other.replace_from), replace_length(other.replace_length)
2062{
2063}
2064
2065QInputMethodEvent::~QInputMethodEvent()
2066{
2067 // must be empty until ### Qt 6
2068}
2069
2070/*!
2071 Sets the commit string to \a commitString.
2072
2073 The commit string is the text that should get added to (or
2074 replace parts of) the text of the editor widget. It usually is a
2075 result of the input operations and has to be inserted to the
2076 widgets text directly before the preedit string.
2077
2078 If the commit string should replace parts of the of the text in
2079 the editor, \a replaceLength specifies the number of
2080 characters to be replaced. \a replaceFrom specifies the position
2081 at which characters are to be replaced relative from the start of
2082 the preedit string.
2083
2084 \sa commitString(), replacementStart(), replacementLength()
2085*/
2086void QInputMethodEvent::setCommitString(const QString &commitString, int replaceFrom, int replaceLength)
2087{
2088 commit = commitString;
2089 replace_from = replaceFrom;
2090 replace_length = replaceLength;
2091}
2092
2093/*!
2094 \fn const QList<Attribute> &QInputMethodEvent::attributes() const
2095
2096 Returns the list of attributes passed to the QInputMethodEvent
2097 constructor. The attributes control the visual appearance of the
2098 preedit string (the visual appearance of text outside the preedit
2099 string is controlled by the widget only).
2100
2101 \sa preeditString(), Attribute
2102*/
2103
2104/*!
2105 \fn const QString &QInputMethodEvent::preeditString() const
2106
2107 Returns the preedit text, i.e. the text before the user started
2108 editing it.
2109
2110 \sa commitString(), attributes()
2111*/
2112
2113/*!
2114 \fn const QString &QInputMethodEvent::commitString() const
2115
2116 Returns the text that should get added to (or replace parts of)
2117 the text of the editor widget. It usually is a result of the
2118 input operations and has to be inserted to the widgets text
2119 directly before the preedit string.
2120
2121 \sa setCommitString(), preeditString(), replacementStart(), replacementLength()
2122*/
2123
2124/*!
2125 \fn int QInputMethodEvent::replacementStart() const
2126
2127 Returns the position at which characters are to be replaced relative
2128 from the start of the preedit string.
2129
2130 \sa replacementLength(), setCommitString()
2131*/
2132
2133/*!
2134 \fn int QInputMethodEvent::replacementLength() const
2135
2136 Returns the number of characters to be replaced in the preedit
2137 string.
2138
2139 \sa replacementStart(), setCommitString()
2140*/
2141
2142/*!
2143 \class QInputMethodQueryEvent
2144 \since 5.0
2145 \inmodule QtGui
2146
2147 \brief The QInputMethodQueryEvent class provides an event sent by the input context to input objects.
2148
2149 It is used by the
2150 input method to query a set of properties of the object to be
2151 able to support complex input method operations as support for
2152 surrounding text and reconversions.
2153
2154 queries() specifies which properties are queried.
2155
2156 The object should call setValue() on the event to fill in the requested
2157 data before calling accept().
2158*/
2159
2160/*!
2161 \fn Qt::InputMethodQueries QInputMethodQueryEvent::queries() const
2162
2163 Returns the properties queried by the event.
2164 */
2165
2166/*!
2167 Constructs a query event for properties given by \a queries.
2168 */
2169QInputMethodQueryEvent::QInputMethodQueryEvent(Qt::InputMethodQueries queries)
2170 : QEvent(InputMethodQuery),
2171 m_queries(queries)
2172{
2173}
2174
2175/*!
2176 \internal
2177 */
2178QInputMethodQueryEvent::~QInputMethodQueryEvent()
2179{
2180}
2181
2182/*!
2183 Sets property \a query to \a value.
2184 */
2185void QInputMethodQueryEvent::setValue(Qt::InputMethodQuery query, const QVariant &value)
2186{
2187 for (int i = 0; i < m_values.size(); ++i) {
2188 if (m_values.at(i).query == query) {
2189 m_values[i].value = value;
2190 return;
2191 }
2192 }
2193 QueryPair pair = { .query: query, .value: value };
2194 m_values.append(t: pair);
2195}
2196
2197/*!
2198 Returns value of the property \a query.
2199 */
2200QVariant QInputMethodQueryEvent::value(Qt::InputMethodQuery query) const
2201{
2202 for (int i = 0; i < m_values.size(); ++i)
2203 if (m_values.at(i).query == query)
2204 return m_values.at(i).value;
2205 return QVariant();
2206}
2207
2208#if QT_CONFIG(tabletevent)
2209
2210/*!
2211 \class QTabletEvent
2212 \brief The QTabletEvent class contains parameters that describe a Tablet event.
2213 \inmodule QtGui
2214
2215 \ingroup events
2216
2217 \e{Tablet events} are generated from tablet peripherals such as Wacom
2218 tablets and various other brands, and electromagnetic stylus devices
2219 included with some types of tablet computers. (It is not the same as
2220 \l QTouchEvent which a touchscreen generates, even when a passive stylus is
2221 used on a touchscreen.)
2222
2223 Tablet events are similar to mouse events; for example, the \l x(), \l y(),
2224 \l pos(), \l globalX(), \l globalY(), and \l globalPos() accessors provide
2225 the cursor position, and you can see which \l buttons() are pressed
2226 (pressing the stylus tip against the tablet surface is equivalent to a left
2227 mouse button). But tablet events also pass through some extra information
2228 that the tablet device driver provides; for example, you might want to do
2229 subpixel rendering with higher resolution coordinates (\l globalPosF()),
2230 adjust color brightness based on the \l pressure() of the tool against the
2231 tablet surface, use different brushes depending on the type of tool in use
2232 (\l deviceType()), modulate the brush shape in some way according to the
2233 X-axis and Y-axis tilt of the tool with respect to the tablet surface
2234 (\l xTilt() and \l yTilt()), and use a virtual eraser instead of a brush if
2235 the user switches to the other end of a double-ended stylus
2236 (\l pointerType()).
2237
2238 Every event contains an accept flag that indicates whether the receiver
2239 wants the event. You should call QTabletEvent::accept() if you handle the
2240 tablet event; otherwise it will be sent to the parent widget. The exception
2241 are TabletEnterProximity and TabletLeaveProximity events: these are only
2242 sent to QApplication and do not check whether or not they are accepted.
2243
2244 The QWidget::setEnabled() function can be used to enable or disable
2245 mouse, tablet and keyboard events for a widget.
2246
2247 The event handler QWidget::tabletEvent() receives TabletPress,
2248 TabletRelease and TabletMove events. Qt will first send a
2249 tablet event, then if it is not accepted by any widget, it will send a
2250 mouse event. This allows users of applications that are not designed for
2251 tablets to use a tablet like a mouse. However high-resolution drawing
2252 applications should handle the tablet events, because they can occur at a
2253 higher frequency, which is a benefit for smooth and accurate drawing.
2254 If the tablet events are rejected, the synthetic mouse events may be
2255 compressed for efficiency.
2256
2257 New in Qt 5.4: QTabletEvent includes all information available from the
2258 device, including \l QTabletEvent::buttons(). Previously it was not
2259 possible to accept all tablet events and also know which stylus buttons
2260 were pressed.
2261
2262 Note that pressing the stylus button while the stylus hovers over the
2263 tablet will generate a button press on some types of tablets, while on
2264 other types it will be necessary to press the stylus against the tablet
2265 surface in order to register the simultaneous stylus button press.
2266
2267 \section1 Notes for X11 Users
2268
2269 If the tablet is configured in xorg.conf to use the Wacom driver, there
2270 will be separate XInput "devices" for the stylus, eraser, and (optionally)
2271 cursor and touchpad. Qt recognizes these by their names. Otherwise, if the
2272 tablet is configured to use the evdev driver, there will be only one device
2273 and applications may not be able to distinguish the stylus from the eraser.
2274
2275 \section1 Notes for Windows Users
2276
2277 Tablet support currently requires the WACOM windows driver providing the DLL
2278 \c{wintab32.dll} to be installed. It is contained in older packages,
2279 for example \c{pentablet_5.3.5-3.exe}.
2280
2281*/
2282
2283/*!
2284 \enum QTabletEvent::TabletDevice
2285
2286 This enum defines what type of device is generating the event.
2287
2288 \value NoDevice No device, or an unknown device.
2289 \value Puck A Puck (a device that is similar to a flat mouse with
2290 a transparent circle with cross-hairs).
2291 \value Stylus A Stylus.
2292 \value Airbrush An airbrush
2293 \value FourDMouse A 4D Mouse.
2294 \value RotationStylus A special stylus that also knows about rotation
2295 (a 6D stylus). \since 4.1
2296 \omitvalue XFreeEraser
2297*/
2298
2299/*!
2300 \enum QTabletEvent::PointerType
2301
2302 This enum defines what type of point is generating the event.
2303
2304 \value UnknownPointer An unknown device.
2305 \value Pen Tip end of a stylus-like device (the narrow end of the pen).
2306 \value Cursor Any puck-like device.
2307 \value Eraser Eraser end of a stylus-like device (the broad end of the pen).
2308
2309 \sa pointerType()
2310*/
2311
2312/*!
2313 Construct a tablet event of the given \a type.
2314
2315 The \a pos parameter indicates where the event occurred in the
2316 widget; \a globalPos is the corresponding position in absolute
2317 coordinates.
2318
2319 \a pressure contains the pressure exerted on the \a device.
2320
2321 \a pointerType describes the type of pen that is being used.
2322
2323 \a xTilt and \a yTilt contain the device's degree of tilt from the
2324 x and y axes respectively.
2325
2326 \a keyState specifies which keyboard modifiers are pressed (e.g.,
2327 \uicontrol{Ctrl}).
2328
2329 The \a uniqueID parameter contains the unique ID for the current device.
2330
2331 The \a z parameter contains the coordinate of the device on the tablet, this
2332 is usually given by a wheel on 4D mouse. If the device does not support a
2333 Z-axis, pass zero here.
2334
2335 The \a tangentialPressure parameter contins the tangential pressure of an air
2336 brush. If the device does not support tangential pressure, pass 0 here.
2337
2338 \a rotation contains the device's rotation in degrees.
2339 4D mice, the Wacom Art Pen, and the Apple Pencil support rotation.
2340 If the device does not support rotation, pass 0 here.
2341
2342 The \a button that caused the event is given as a value from the
2343 \l Qt::MouseButton enum. If the event \a type is not \l TabletPress or
2344 \l TabletRelease, the appropriate button for this event is \l Qt::NoButton.
2345
2346 \a buttons is the state of all buttons at the time of the event.
2347
2348 \sa pos(), globalPos(), device(), pressure(), xTilt(), yTilt(), uniqueId(), rotation(),
2349 tangentialPressure(), z()
2350*/
2351
2352QTabletEvent::QTabletEvent(Type type, const QPointF &pos, const QPointF &globalPos,
2353 int device, int pointerType,
2354 qreal pressure, int xTilt, int yTilt, qreal tangentialPressure,
2355 qreal rotation, int z, Qt::KeyboardModifiers keyState, qint64 uniqueID,
2356 Qt::MouseButton button, Qt::MouseButtons buttons)
2357 : QInputEvent(type, keyState),
2358 mPos(pos),
2359 mGPos(globalPos),
2360 mDev(device),
2361 mPointerType(pointerType),
2362 mXT(xTilt),
2363 mYT(yTilt),
2364 mZ(z),
2365 mPress(pressure),
2366 mTangential(tangentialPressure),
2367 mRot(rotation),
2368 mUnique(uniqueID),
2369 mExtra(new QTabletEventPrivate(button, buttons))
2370{
2371}
2372
2373#if QT_DEPRECATED_SINCE(5, 15)
2374/*!
2375 Construct a tablet event of the given \a type.
2376
2377 The \a pos parameter indicates where the event occurred in the
2378 widget; \a globalPos is the corresponding position in absolute
2379 coordinates.
2380
2381 \a pressure contains the pressure exerted on the \a device.
2382
2383 \a pointerType describes the type of pen that is being used.
2384
2385 \a xTilt and \a yTilt contain the device's degree of tilt from the
2386 x and y axes respectively.
2387
2388 \a keyState specifies which keyboard modifiers are pressed (e.g.,
2389 \uicontrol{Ctrl}).
2390
2391 The \a uniqueID parameter contains the unique ID for the current device.
2392
2393 The \a z parameter contains the coordinate of the device on the tablet, this
2394 is usually given by a wheel on 4D mouse. If the device does not support a
2395 Z-axis, pass zero here.
2396
2397 The \a tangentialPressure parameter contins the tangential pressure of an air
2398 brush. If the device does not support tangential pressure, pass 0 here.
2399
2400 \a rotation contains the device's rotation in degrees. 4D mice support
2401 rotation. If the device does not support rotation, pass 0 here.
2402
2403 \sa pos(), globalPos(), device(), pressure(), xTilt(), yTilt(), uniqueId(), rotation(),
2404 tangentialPressure(), z()
2405
2406 \deprecated in 5.4: use the constructor with MouseButton status
2407*/
2408
2409QTabletEvent::QTabletEvent(Type type, const QPointF &pos, const QPointF &globalPos,
2410 int device, int pointerType,
2411 qreal pressure, int xTilt, int yTilt, qreal tangentialPressure,
2412 qreal rotation, int z, Qt::KeyboardModifiers keyState, qint64 uniqueID)
2413 : QTabletEvent(type, pos, globalPos, device, pointerType, pressure, xTilt, yTilt,
2414 tangentialPressure, rotation, z, keyState, uniqueID, Qt::NoButton, Qt::NoButton)
2415{
2416}
2417#endif
2418
2419/*!
2420 \internal
2421*/
2422QTabletEvent::~QTabletEvent()
2423{
2424 delete static_cast<QTabletEventPrivate *>(mExtra);
2425}
2426
2427/*!
2428 Returns the button that caused the event.
2429
2430 Note that the returned value is always Qt::NoButton for \l TabletMove,
2431 \l TabletEnterProximity and \l TabletLeaveProximity events.
2432
2433 \sa buttons(), Qt::MouseButton
2434*/
2435Qt::MouseButton QTabletEvent::button() const
2436{
2437 return static_cast<QTabletEventPrivate *>(mExtra)->b;
2438}
2439
2440/*!
2441 Returns the button state when the event was generated. The button state is
2442 a combination of buttons from the \l Qt::MouseButton enum using the OR
2443 operator. For \l TabletMove events, this is all buttons that are pressed
2444 down. For \l TabletPress events this includes the button that caused the
2445 event. For \l TabletRelease events this excludes the button that caused the
2446 event.
2447
2448 \sa button(), Qt::MouseButton
2449*/
2450Qt::MouseButtons QTabletEvent::buttons() const
2451{
2452 return static_cast<QTabletEventPrivate *>(mExtra)->buttonState;
2453}
2454
2455/*!
2456 \fn TabletDevices QTabletEvent::device() const
2457
2458 \deprecated Use deviceType().
2459*/
2460
2461/*!
2462 \fn TabletDevices QTabletEvent::deviceType() const
2463
2464 Returns the type of device that generated the event.
2465
2466 \sa TabletDevice
2467*/
2468
2469/*!
2470 \fn PointerType QTabletEvent::pointerType() const
2471
2472 Returns the type of point that generated the event.
2473*/
2474
2475/*!
2476 \fn qreal QTabletEvent::tangentialPressure() const
2477
2478 Returns the tangential pressure for the device. This is typically given by a finger
2479 wheel on an airbrush tool. The range is from -1.0 to 1.0. 0.0 indicates a
2480 neutral position. Current airbrushes can only move in the positive
2481 direction from the neutrual position. If the device does not support
2482 tangential pressure, this value is always 0.0.
2483
2484 \sa pressure()
2485*/
2486
2487/*!
2488 \fn qreal QTabletEvent::rotation() const
2489
2490 Returns the rotation of the current tool in degrees, where zero means the
2491 tip of the stylus is pointing towards the top of the tablet, a positive
2492 value means it's turned to the right, and a negative value means it's
2493 turned to the left. This can be given by a 4D Mouse or a rotation-capable
2494 stylus (such as the Wacom Art Pen or the Apple Pencil). If the device does
2495 not support rotation, this value is always 0.0.
2496*/
2497
2498/*!
2499 \fn qreal QTabletEvent::pressure() const
2500
2501 Returns the pressure for the device. 0.0 indicates that the stylus is not
2502 on the tablet, 1.0 indicates the maximum amount of pressure for the stylus.
2503
2504 \sa tangentialPressure()
2505*/
2506
2507/*!
2508 \fn int QTabletEvent::xTilt() const
2509
2510 Returns the angle between the device (a pen, for example) and the
2511 perpendicular in the direction of the x axis.
2512 Positive values are towards the tablet's physical right. The angle
2513 is in the range -60 to +60 degrees.
2514
2515 \image qtabletevent-tilt.png
2516
2517 \sa yTilt()
2518*/
2519
2520/*!
2521 \fn int QTabletEvent::yTilt() const
2522
2523 Returns the angle between the device (a pen, for example) and the
2524 perpendicular in the direction of the y axis.
2525 Positive values are towards the bottom of the tablet. The angle is
2526 within the range -60 to +60 degrees.
2527
2528 \sa xTilt()
2529*/
2530
2531/*!
2532 \fn QPoint QTabletEvent::pos() const
2533
2534 Returns the position of the device, relative to the widget that
2535 received the event.
2536
2537 If you move widgets around in response to mouse events, use
2538 globalPos() instead of this function.
2539
2540 \sa x(), y(), globalPos()
2541*/
2542
2543/*!
2544 \fn int QTabletEvent::x() const
2545
2546 Returns the x position of the device, relative to the widget that
2547 received the event.
2548
2549 \sa y(), pos()
2550*/
2551
2552/*!
2553 \fn int QTabletEvent::y() const
2554
2555 Returns the y position of the device, relative to the widget that
2556 received the event.
2557
2558 \sa x(), pos()
2559*/
2560
2561/*!
2562 \fn int QTabletEvent::z() const
2563
2564 Returns the z position of the device. Typically this is represented by a
2565 wheel on a 4D Mouse. If the device does not support a Z-axis, this value is
2566 always zero. This is \b not the same as pressure.
2567
2568 \sa pressure()
2569*/
2570
2571/*!
2572 \fn QPoint QTabletEvent::globalPos() const
2573
2574 Returns the global position of the device \e{at the time of the
2575 event}. This is important on asynchronous windows systems like X11;
2576 whenever you move your widgets around in response to mouse events,
2577 globalPos() can differ significantly from the current position
2578 QCursor::pos().
2579
2580 \sa globalX(), globalY()
2581*/
2582
2583/*!
2584 \fn int QTabletEvent::globalX() const
2585
2586 Returns the global x position of the mouse pointer at the time of
2587 the event.
2588
2589 \sa globalY(), globalPos(), hiResGlobalX()
2590*/
2591
2592/*!
2593 \fn int QTabletEvent::globalY() const
2594
2595 Returns the global y position of the tablet device at the time of
2596 the event.
2597
2598 \sa globalX(), globalPos(), hiResGlobalY()
2599*/
2600
2601/*!
2602 \fn qint64 QTabletEvent::uniqueId() const
2603
2604 Returns a unique ID for the current device, making it possible
2605 to differentiate between multiple devices being used at the same
2606 time on the tablet.
2607
2608 Support of this feature is dependent on the tablet.
2609
2610 Values for the same device may vary from OS to OS.
2611
2612 Later versions of the Wacom driver for Linux will now report
2613 the ID information. If you have a tablet that supports unique ID
2614 and are not getting the information on Linux, consider upgrading
2615 your driver.
2616
2617 As of Qt 4.2, the unique ID is the same regardless of the orientation
2618 of the pen. Earlier versions would report a different value when using
2619 the eraser-end versus the pen-end of the stylus on some OS's.
2620
2621 \sa pointerType()
2622*/
2623
2624/*!
2625 \fn qreal &QTabletEvent::hiResGlobalX() const
2626
2627 The high precision x position of the tablet device.
2628
2629 \obsolete use globalPosF()
2630*/
2631
2632/*!
2633 \fn qreal &QTabletEvent::hiResGlobalY() const
2634
2635 The high precision y position of the tablet device.
2636
2637 \obsolete use globalPosF()
2638*/
2639
2640/*!
2641 \fn const QPointF &QTabletEvent::posF() const
2642
2643 Returns the position of the device, relative to the widget that
2644 received the event.
2645
2646 If you move widgets around in response to mouse events, use
2647 globalPosF() instead of this function.
2648
2649 \sa globalPosF()
2650*/
2651
2652/*!
2653 \fn const QPointF &QTabletEvent::globalPosF() const
2654
2655 Returns the global position of the device \e{at the time of the
2656 event}. This is important on asynchronous windows systems like X11;
2657 whenever you move your widgets around in response to mouse events,
2658 globalPosF() can differ significantly from the current position
2659 QCursor::pos().
2660
2661 \sa posF()
2662*/
2663
2664#endif // QT_CONFIG(tabletevent)
2665
2666#ifndef QT_NO_GESTURES
2667/*!
2668 \class QNativeGestureEvent
2669 \since 5.2
2670 \brief The QNativeGestureEvent class contains parameters that describe a gesture event.
2671 \inmodule QtGui
2672 \ingroup events
2673
2674 Native gesture events are generated by the operating system, typically by
2675 interpreting touch events. Gesture events are high-level events such
2676 as zoom or rotate.
2677
2678 \table
2679 \header
2680 \li Event Type
2681 \li Description
2682 \li Touch sequence
2683 \row
2684 \li Qt::ZoomNativeGesture
2685 \li Magnification delta in percent.
2686 \li \macos: Two-finger pinch.
2687 \row
2688 \li Qt::SmartZoomNativeGesture
2689 \li Boolean magnification state.
2690 \li \macos: Two-finger douple tap (trackpad) / One-finger douple tap (magic mouse).
2691 \row
2692 \li Qt::RotateNativeGesture
2693 \li Rotation delta in degrees.
2694 \li \macos: Two-finger rotate.
2695 \endtable
2696
2697
2698 In addition, BeginNativeGesture and EndNativeGesture are sent before and after
2699 gesture event streams:
2700
2701 BeginNativeGesture
2702 ZoomNativeGesture
2703 ZoomNativeGesture
2704 ZoomNativeGesture
2705 EndNativeGesture
2706
2707 \sa Qt::NativeGestureType, QGestureEvent
2708*/
2709
2710#if QT_DEPRECATED_SINCE(5, 10)
2711/*!
2712 \deprecated The QTouchDevice parameter is now required
2713*/
2714QNativeGestureEvent::QNativeGestureEvent(Qt::NativeGestureType type, const QPointF &localPos, const QPointF &windowPos,
2715 const QPointF &screenPos, qreal realValue, ulong sequenceId, quint64 intValue)
2716 : QInputEvent(QEvent::NativeGesture), mGestureType(type),
2717 mLocalPos(localPos), mWindowPos(windowPos), mScreenPos(screenPos), mRealValue(realValue),
2718 mSequenceId(sequenceId), mIntValue(intValue)
2719{ }
2720#endif
2721
2722typedef QHash<const QNativeGestureEvent*, const QTouchDevice*> NativeGestureEventDataHash;
2723// ### Qt6: move this to a member in QNativeGestureEvent
2724Q_GLOBAL_STATIC(NativeGestureEventDataHash, g_nativeGestureEventDataHash)
2725
2726/*!
2727 Constructs a native gesture event of type \a type originating from \a device.
2728
2729 The points \a localPos, \a windowPos and \a screenPos specify the
2730 gesture position relative to the receiving widget or item,
2731 window, and screen, respectively.
2732
2733 \a realValue is the \macos event parameter, \a sequenceId and \a intValue are the Windows event parameters.
2734 \since 5.10
2735*/
2736QNativeGestureEvent::QNativeGestureEvent(Qt::NativeGestureType type, const QTouchDevice *device, const QPointF &localPos, const QPointF &windowPos,
2737 const QPointF &screenPos, qreal realValue, ulong sequenceId, quint64 intValue)
2738 : QInputEvent(QEvent::NativeGesture), mGestureType(type),
2739 mLocalPos(localPos), mWindowPos(windowPos), mScreenPos(screenPos), mRealValue(realValue),
2740 mSequenceId(sequenceId), mIntValue(intValue)
2741{
2742 g_nativeGestureEventDataHash->insert(akey: this, avalue: device);
2743}
2744
2745QNativeGestureEvent::~QNativeGestureEvent()
2746{
2747 g_nativeGestureEventDataHash->remove(akey: this);
2748}
2749
2750/*!
2751 \since 5.10
2752
2753 Returns the device.
2754*/
2755
2756const QTouchDevice *QNativeGestureEvent::device() const
2757{
2758 return g_nativeGestureEventDataHash->value(akey: this);
2759}
2760
2761/*!
2762 \fn QNativeGestureEvent::gestureType() const
2763 \since 5.2
2764
2765 Returns the gesture type.
2766*/
2767
2768/*!
2769 \fn QNativeGestureEvent::value() const
2770 \since 5.2
2771
2772 Returns the gesture value. The value should be interpreted based on the
2773 gesture type. For example, a Zoom gesture provides a scale factor while a Rotate
2774 gesture provides a rotation delta.
2775
2776 \sa QNativeGestureEvent, gestureType()
2777*/
2778
2779/*!
2780 \fn QPoint QNativeGestureEvent::globalPos() const
2781 \since 5.2
2782
2783 Returns the position of the gesture as a QPointF in screen coordinates
2784*/
2785
2786/*!
2787 \fn QPoint QNativeGestureEvent::pos() const
2788 \since 5.2
2789
2790 Returns the position of the mouse cursor, relative to the widget
2791 or item that received the event.
2792*/
2793
2794/*!
2795 \fn QPointF QNativeGestureEvent::localPos() const
2796 \since 5.2
2797
2798 Returns the position of the gesture as a QPointF, relative to the
2799 widget or item that received the event.
2800*/
2801
2802/*!
2803 \fn QPointF QNativeGestureEvent::screenPos() const
2804 \since 5.2
2805
2806 Returns the position of the gesture as a QPointF in screen coordinates.
2807*/
2808
2809/*!
2810 \fn QPointF QNativeGestureEvent::windowPos() const
2811 \since 5.2
2812
2813 Returns the position of the gesture as a QPointF, relative to the
2814 window that received the event.
2815*/
2816#endif // QT_NO_GESTURES
2817
2818#if QT_CONFIG(draganddrop)
2819/*!
2820 Creates a QDragMoveEvent of the required \a type indicating
2821 that the mouse is at position \a pos given within a widget.
2822
2823 The mouse and keyboard states are specified by \a buttons and
2824 \a modifiers, and the \a actions describe the types of drag
2825 and drop operation that are possible.
2826 The drag data is passed as MIME-encoded information in \a data.
2827
2828 \warning Do not attempt to create a QDragMoveEvent yourself.
2829 These objects rely on Qt's internal state.
2830*/
2831QDragMoveEvent::QDragMoveEvent(const QPoint& pos, Qt::DropActions actions, const QMimeData *data,
2832 Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers, Type type)
2833 : QDropEvent(pos, actions, data, buttons, modifiers, type)
2834 , rect(pos, QSize(1, 1))
2835{}
2836
2837/*!
2838 Destroys the event.
2839*/
2840QDragMoveEvent::~QDragMoveEvent()
2841{
2842}
2843
2844/*!
2845 \fn void QDragMoveEvent::accept(const QRect &rectangle)
2846
2847 The same as accept(), but also notifies that future moves will
2848 also be acceptable if they remain within the \a rectangle
2849 given on the widget. This can improve performance, but may
2850 also be ignored by the underlying system.
2851
2852 If the rectangle is empty, drag move events will be sent
2853 continuously. This is useful if the source is scrolling in a
2854 timer event.
2855*/
2856
2857/*!
2858 \fn void QDragMoveEvent::accept()
2859
2860 \overload
2861
2862 Calls QDropEvent::accept().
2863*/
2864
2865/*!
2866 \fn void QDragMoveEvent::ignore()
2867
2868 \overload
2869
2870 Calls QDropEvent::ignore().
2871*/
2872
2873/*!
2874 \fn void QDragMoveEvent::ignore(const QRect &rectangle)
2875
2876 The opposite of the accept(const QRect&) function.
2877 Moves within the \a rectangle are not acceptable, and will be
2878 ignored.
2879*/
2880
2881/*!
2882 \fn QRect QDragMoveEvent::answerRect() const
2883
2884 Returns the rectangle in the widget where the drop will occur if accepted.
2885 You can use this information to restrict drops to certain places on the
2886 widget.
2887*/
2888
2889
2890/*!
2891 \class QDropEvent
2892 \ingroup events
2893 \ingroup draganddrop
2894 \inmodule QtGui
2895
2896 \brief The QDropEvent class provides an event which is sent when a
2897 drag and drop action is completed.
2898
2899 When a widget \l{QWidget::setAcceptDrops()}{accepts drop events}, it will
2900 receive this event if it has accepted the most recent QDragEnterEvent or
2901 QDragMoveEvent sent to it.
2902
2903 The drop event contains a proposed action, available from proposedAction(), for
2904 the widget to either accept or ignore. If the action can be handled by the
2905 widget, you should call the acceptProposedAction() function. Since the
2906 proposed action can be a combination of \l Qt::DropAction values, it may be
2907 useful to either select one of these values as a default action or ask
2908 the user to select their preferred action.
2909
2910 If the proposed drop action is not suitable, perhaps because your custom
2911 widget does not support that action, you can replace it with any of the
2912 \l{possibleActions()}{possible drop actions} by calling setDropAction()
2913 with your preferred action. If you set a value that is not present in the
2914 bitwise OR combination of values returned by possibleActions(), the default
2915 copy action will be used. Once a replacement drop action has been set, call
2916 accept() instead of acceptProposedAction() to complete the drop operation.
2917
2918 The mimeData() function provides the data dropped on the widget in a QMimeData
2919 object. This contains information about the MIME type of the data in addition to
2920 the data itself.
2921
2922 \sa QMimeData, QDrag, {Drag and Drop}
2923*/
2924
2925/*!
2926 \fn const QMimeData *QDropEvent::mimeData() const
2927
2928 Returns the data that was dropped on the widget and its associated MIME
2929 type information.
2930*/
2931
2932// ### pos is in which coordinate system?
2933/*!
2934 Constructs a drop event of a certain \a type corresponding to a
2935 drop at the point specified by \a pos in the destination widget's
2936 coordinate system.
2937
2938 The \a actions indicate which types of drag and drop operation can
2939 be performed, and the drag data is stored as MIME-encoded data in \a data.
2940
2941 The states of the mouse buttons and keyboard modifiers at the time of
2942 the drop are specified by \a buttons and \a modifiers.
2943*/
2944QDropEvent::QDropEvent(const QPointF& pos, Qt::DropActions actions, const QMimeData *data,
2945 Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers, Type type)
2946 : QEvent(type), p(pos), mouseState(buttons),
2947 modState(modifiers), act(actions),
2948 mdata(data)
2949{
2950 default_action = QGuiApplicationPrivate::platformIntegration()->drag()->defaultAction(possibleActions: act, modifiers);
2951 drop_action = default_action;
2952 ignore();
2953}
2954
2955/*! \internal */
2956QDropEvent::~QDropEvent()
2957{
2958}
2959
2960
2961/*!
2962 If the source of the drag operation is a widget in this
2963 application, this function returns that source; otherwise it
2964 returns \nullptr. The source of the operation is the first parameter to
2965 the QDrag object used instantiate the drag.
2966
2967 This is useful if your widget needs special behavior when dragging
2968 to itself.
2969
2970 \sa QDrag::QDrag()
2971*/
2972QObject* QDropEvent::source() const
2973{
2974 if (const QDragManager *manager = QDragManager::self())
2975 return manager->source();
2976 return nullptr;
2977}
2978
2979
2980void QDropEvent::setDropAction(Qt::DropAction action)
2981{
2982 if (!(action & act) && action != Qt::IgnoreAction)
2983 action = default_action;
2984 drop_action = action;
2985}
2986
2987/*!
2988 \fn QPoint QDropEvent::pos() const
2989
2990 Returns the position where the drop was made.
2991*/
2992
2993/*!
2994 \fn const QPointF& QDropEvent::posF() const
2995
2996 Returns the position where the drop was made.
2997*/
2998
2999/*!
3000 \fn Qt::MouseButtons QDropEvent::mouseButtons() const
3001
3002 Returns the mouse buttons that are pressed..
3003*/
3004
3005/*!
3006 \fn Qt::KeyboardModifiers QDropEvent::keyboardModifiers() const
3007
3008 Returns the modifier keys that are pressed.
3009*/
3010
3011/*!
3012 \fn void QDropEvent::setDropAction(Qt::DropAction action)
3013
3014 Sets the \a action to be performed on the data by the target.
3015 Use this to override the \l{proposedAction()}{proposed action}
3016 with one of the \l{possibleActions()}{possible actions}.
3017
3018 If you set a drop action that is not one of the possible actions, the
3019 drag and drop operation will default to a copy operation.
3020
3021 Once you have supplied a replacement drop action, call accept()
3022 instead of acceptProposedAction().
3023
3024 \sa dropAction()
3025*/
3026
3027/*!
3028 \fn Qt::DropAction QDropEvent::dropAction() const
3029
3030 Returns the action to be performed on the data by the target. This may be
3031 different from the action supplied in proposedAction() if you have called
3032 setDropAction() to explicitly choose a drop action.
3033
3034 \sa setDropAction()
3035*/
3036
3037/*!
3038 \fn Qt::DropActions QDropEvent::possibleActions() const
3039
3040 Returns an OR-combination of possible drop actions.
3041
3042 \sa dropAction()
3043*/
3044
3045/*!
3046 \fn Qt::DropAction QDropEvent::proposedAction() const
3047
3048 Returns the proposed drop action.
3049
3050 \sa dropAction()
3051*/
3052
3053/*!
3054 \fn void QDropEvent::acceptProposedAction()
3055
3056 Sets the drop action to be the proposed action.
3057
3058 \sa setDropAction(), proposedAction(), {QEvent::accept()}{accept()}
3059*/
3060
3061/*!
3062 \class QDragEnterEvent
3063 \brief The QDragEnterEvent class provides an event which is sent
3064 to a widget when a drag and drop action enters it.
3065
3066 \ingroup events
3067 \ingroup draganddrop
3068 \inmodule QtGui
3069
3070 A widget must accept this event in order to receive the \l
3071 {QDragMoveEvent}{drag move events} that are sent while the drag
3072 and drop action is in progress. The drag enter event is always
3073 immediately followed by a drag move event.
3074
3075 QDragEnterEvent inherits most of its functionality from
3076 QDragMoveEvent, which in turn inherits most of its functionality
3077 from QDropEvent.
3078
3079 \sa QDragLeaveEvent, QDragMoveEvent, QDropEvent
3080*/
3081
3082/*!
3083 Constructs a QDragEnterEvent that represents a drag entering a
3084 widget at the given \a point with mouse and keyboard states specified by
3085 \a buttons and \a modifiers.
3086
3087 The drag data is passed as MIME-encoded information in \a data, and the
3088 specified \a actions describe the possible types of drag and drop
3089 operation that can be performed.
3090
3091 \warning Do not create a QDragEnterEvent yourself since these
3092 objects rely on Qt's internal state.
3093*/
3094QDragEnterEvent::QDragEnterEvent(const QPoint& point, Qt::DropActions actions, const QMimeData *data,
3095 Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers)
3096 : QDragMoveEvent(point, actions, data, buttons, modifiers, DragEnter)
3097{}
3098
3099/*! \internal
3100*/
3101QDragEnterEvent::~QDragEnterEvent()
3102{
3103}
3104
3105/*!
3106 \class QDragMoveEvent
3107 \brief The QDragMoveEvent class provides an event which is sent while a drag and drop action is in progress.
3108
3109 \ingroup events
3110 \ingroup draganddrop
3111 \inmodule QtGui
3112
3113 A widget will receive drag move events repeatedly while the drag
3114 is within its boundaries, if it accepts
3115 \l{QWidget::setAcceptDrops()}{drop events} and \l
3116 {QWidget::dragEnterEvent()}{enter events}. The widget should
3117 examine the event to see what kind of \l{mimeData()}{data} it
3118 provides, and call the accept() function to accept the drop if appropriate.
3119
3120 The rectangle supplied by the answerRect() function can be used to restrict
3121 drops to certain parts of the widget. For example, we can check whether the
3122 rectangle intersects with the geometry of a certain child widget and only
3123 call \l{QDropEvent::acceptProposedAction()}{acceptProposedAction()} if that
3124 is the case.
3125
3126 Note that this class inherits most of its functionality from
3127 QDropEvent.
3128
3129 \sa QDragEnterEvent, QDragLeaveEvent, QDropEvent
3130*/
3131
3132/*!
3133 \class QDragLeaveEvent
3134 \brief The QDragLeaveEvent class provides an event that is sent to a widget when a drag and drop action leaves it.
3135
3136 \ingroup events
3137 \ingroup draganddrop
3138 \inmodule QtGui
3139
3140 This event is always preceded by a QDragEnterEvent and a series
3141 of \l{QDragMoveEvent}s. It is not sent if a QDropEvent is sent
3142 instead.
3143
3144 \sa QDragEnterEvent, QDragMoveEvent, QDropEvent
3145*/
3146
3147/*!
3148 Constructs a QDragLeaveEvent.
3149
3150 \warning Do not create a QDragLeaveEvent yourself since these
3151 objects rely on Qt's internal state.
3152*/
3153QDragLeaveEvent::QDragLeaveEvent()
3154 : QEvent(DragLeave)
3155{}
3156
3157/*! \internal
3158*/
3159QDragLeaveEvent::~QDragLeaveEvent()
3160{
3161}
3162#endif // QT_CONFIG(draganddrop)
3163
3164/*!
3165 \class QHelpEvent
3166 \brief The QHelpEvent class provides an event that is used to request helpful information
3167 about a particular point in a widget.
3168
3169 \ingroup events
3170 \ingroup helpsystem
3171 \inmodule QtGui
3172
3173 This event can be intercepted in applications to provide tooltips
3174 or "What's This?" help for custom widgets. The type() can be
3175 either QEvent::ToolTip or QEvent::WhatsThis.
3176
3177 \sa QToolTip, QWhatsThis, QStatusTipEvent, QWhatsThisClickedEvent
3178*/
3179
3180/*!
3181 Constructs a help event with the given \a type corresponding to the
3182 widget-relative position specified by \a pos and the global position
3183 specified by \a globalPos.
3184
3185 \a type must be either QEvent::ToolTip or QEvent::WhatsThis.
3186
3187 \sa pos(), globalPos()
3188*/
3189QHelpEvent::QHelpEvent(Type type, const QPoint &pos, const QPoint &globalPos)
3190 : QEvent(type), p(pos), gp(globalPos)
3191{}
3192
3193/*!
3194 \fn int QHelpEvent::x() const
3195
3196 Same as pos().x().
3197
3198 \sa y(), pos(), globalPos()
3199*/
3200
3201/*!
3202 \fn int QHelpEvent::y() const
3203
3204 Same as pos().y().
3205
3206 \sa x(), pos(), globalPos()
3207*/
3208
3209/*!
3210 \fn int QHelpEvent::globalX() const
3211
3212 Same as globalPos().x().
3213
3214 \sa x(), globalY(), globalPos()
3215*/
3216
3217/*!
3218 \fn int QHelpEvent::globalY() const
3219
3220 Same as globalPos().y().
3221
3222 \sa y(), globalX(), globalPos()
3223*/
3224
3225/*!
3226 \fn const QPoint &QHelpEvent::pos() const
3227
3228 Returns the mouse cursor position when the event was generated,
3229 relative to the widget to which the event is dispatched.
3230
3231 \sa globalPos(), x(), y()
3232*/
3233
3234/*!
3235 \fn const QPoint &QHelpEvent::globalPos() const
3236
3237 Returns the mouse cursor position when the event was generated
3238 in global coordinates.
3239
3240 \sa pos(), globalX(), globalY()
3241*/
3242
3243/*! \internal
3244*/
3245QHelpEvent::~QHelpEvent()
3246{
3247}
3248
3249#ifndef QT_NO_STATUSTIP
3250
3251/*!
3252 \class QStatusTipEvent
3253 \brief The QStatusTipEvent class provides an event that is used to show messages in a status bar.
3254
3255 \ingroup events
3256 \ingroup helpsystem
3257 \inmodule QtGui
3258
3259 Status tips can be set on a widget using the
3260 QWidget::setStatusTip() function. They are shown in the status
3261 bar when the mouse cursor enters the widget. For example:
3262
3263 \table 100%
3264 \row
3265 \li
3266 \snippet qstatustipevent/main.cpp 1
3267 \dots
3268 \snippet qstatustipevent/main.cpp 3
3269 \li
3270 \image qstatustipevent-widget.png Widget with status tip.
3271 \endtable
3272
3273 Status tips can also be set on actions using the
3274 QAction::setStatusTip() function:
3275
3276 \table 100%
3277 \row
3278 \li
3279 \snippet qstatustipevent/main.cpp 0
3280 \snippet qstatustipevent/main.cpp 2
3281 \dots
3282 \snippet qstatustipevent/main.cpp 3
3283 \li
3284 \image qstatustipevent-action.png Action with status tip.
3285 \endtable
3286
3287 Finally, status tips are supported for the item view classes
3288 through the Qt::StatusTipRole enum value.
3289
3290 \sa QStatusBar, QHelpEvent, QWhatsThisClickedEvent
3291*/
3292
3293/*!
3294 Constructs a status tip event with the text specified by \a tip.
3295
3296 \sa tip()
3297*/
3298QStatusTipEvent::QStatusTipEvent(const QString &tip)
3299 : QEvent(StatusTip), s(tip)
3300{}
3301
3302/*! \internal
3303*/
3304QStatusTipEvent::~QStatusTipEvent()
3305{
3306}
3307
3308/*!
3309 \fn QString QStatusTipEvent::tip() const
3310
3311 Returns the message to show in the status bar.
3312
3313 \sa QStatusBar::showMessage()
3314*/
3315
3316#endif // QT_NO_STATUSTIP
3317
3318#if QT_CONFIG(whatsthis)
3319
3320/*!
3321 \class QWhatsThisClickedEvent
3322 \brief The QWhatsThisClickedEvent class provides an event that
3323 can be used to handle hyperlinks in a "What's This?" text.
3324
3325 \ingroup events
3326 \ingroup helpsystem
3327 \inmodule QtGui
3328
3329 \sa QWhatsThis, QHelpEvent, QStatusTipEvent
3330*/
3331
3332/*!
3333 Constructs an event containing a URL specified by \a href when a link
3334 is clicked in a "What's This?" message.
3335
3336 \sa href()
3337*/
3338QWhatsThisClickedEvent::QWhatsThisClickedEvent(const QString &href)
3339 : QEvent(WhatsThisClicked), s(href)
3340{}
3341
3342/*! \internal
3343*/
3344QWhatsThisClickedEvent::~QWhatsThisClickedEvent()
3345{
3346}
3347
3348/*!
3349 \fn QString QWhatsThisClickedEvent::href() const
3350
3351 Returns the URL that was clicked by the user in the "What's
3352 This?" text.
3353*/
3354
3355#endif // QT_CONFIG(whatsthis)
3356
3357#ifndef QT_NO_ACTION
3358
3359/*!
3360 \class QActionEvent
3361 \brief The QActionEvent class provides an event that is generated
3362 when a QAction is added, removed, or changed.
3363
3364 \ingroup events
3365 \inmodule QtGui
3366
3367 Actions can be added to widgets using QWidget::addAction(). This
3368 generates an \l ActionAdded event, which you can handle to provide
3369 custom behavior. For example, QToolBar reimplements
3370 QWidget::actionEvent() to create \l{QToolButton}s for the
3371 actions.
3372
3373 \sa QAction, QWidget::addAction(), QWidget::removeAction(), QWidget::actions()
3374*/
3375
3376/*!
3377 Constructs an action event. The \a type can be \l ActionChanged,
3378 \l ActionAdded, or \l ActionRemoved.
3379
3380 \a action is the action that is changed, added, or removed. If \a
3381 type is ActionAdded, the action is to be inserted before the
3382 action \a before. If \a before is \nullptr, the action is appended.
3383*/
3384QActionEvent::QActionEvent(int type, QAction *action, QAction *before)
3385 : QEvent(static_cast<QEvent::Type>(type)), act(action), bef(before)
3386{}
3387
3388/*! \internal
3389*/
3390QActionEvent::~QActionEvent()
3391{
3392}
3393
3394/*!
3395 \fn QAction *QActionEvent::action() const
3396
3397 Returns the action that is changed, added, or removed.
3398
3399 \sa before()
3400*/
3401
3402/*!
3403 \fn QAction *QActionEvent::before() const
3404
3405 If type() is \l ActionAdded, returns the action that should
3406 appear before action(). If this function returns \nullptr, the action
3407 should be appended to already existing actions on the same
3408 widget.
3409
3410 \sa action(), QWidget::actions()
3411*/
3412
3413#endif // QT_NO_ACTION
3414
3415/*!
3416 \class QHideEvent
3417 \brief The QHideEvent class provides an event which is sent after a widget is hidden.
3418
3419 \ingroup events
3420 \inmodule QtGui
3421
3422 This event is sent just before QWidget::hide() returns, and also
3423 when a top-level window has been hidden (iconified) by the user.
3424
3425 If spontaneous() is true, the event originated outside the
3426 application. In this case, the user hid the window using the
3427 window manager controls, either by iconifying the window or by
3428 switching to another virtual desktop where the window is not
3429 visible. The window will become hidden but not withdrawn. If the
3430 window was iconified, QWidget::isMinimized() returns \c true.
3431
3432 \sa QShowEvent
3433*/
3434
3435/*!
3436 Constructs a QHideEvent.
3437*/
3438QHideEvent::QHideEvent()
3439 : QEvent(Hide)
3440{}
3441
3442/*! \internal
3443*/
3444QHideEvent::~QHideEvent()
3445{
3446}
3447
3448/*!
3449 \class QShowEvent
3450 \brief The QShowEvent class provides an event that is sent when a widget is shown.
3451
3452 \ingroup events
3453 \inmodule QtGui
3454
3455 There are two kinds of show events: show events caused by the
3456 window system (spontaneous), and internal show events. Spontaneous (QEvent::spontaneous())
3457 show events are sent just after the window system shows the
3458 window; they are also sent when a top-level window is redisplayed
3459 after being iconified. Internal show events are delivered just
3460 before the widget becomes visible.
3461
3462 \sa QHideEvent
3463*/
3464
3465/*!
3466 Constructs a QShowEvent.
3467*/
3468QShowEvent::QShowEvent()
3469 : QEvent(Show)
3470{}
3471
3472/*! \internal
3473*/
3474QShowEvent::~QShowEvent()
3475{
3476}
3477
3478/*!
3479 \class QFileOpenEvent
3480 \brief The QFileOpenEvent class provides an event that will be
3481 sent when there is a request to open a file or a URL.
3482
3483 \ingroup events
3484 \inmodule QtGui
3485
3486 File open events will be sent to the QApplication::instance()
3487 when the operating system requests that a file or URL should be opened.
3488 This is a high-level event that can be caused by different user actions
3489 depending on the user's desktop environment; for example, double
3490 clicking on an file icon in the Finder on \macos.
3491
3492 This event is only used to notify the application of a request.
3493 It may be safely ignored.
3494
3495 \note This class is currently supported for \macos only.
3496
3497 \section1 \macos Example
3498
3499 In order to trigger the event on \macos, the application must be configured
3500 to let the OS know what kind of file(s) it should react on.
3501
3502 For example, the following \c Info.plist file declares that the application
3503 can act as a viewer for files with a PNG extension:
3504
3505 \snippet qfileopenevent/Info.plist Custom Info.plist
3506
3507 The following implementation of a QApplication subclass prints the path to
3508 the file that was, for example, dropped on the Dock icon of the application.
3509
3510 \snippet qfileopenevent/main.cpp QApplication subclass
3511*/
3512
3513/*!
3514 \internal
3515
3516 Constructs a file open event for the given \a file.
3517*/
3518QFileOpenEvent::QFileOpenEvent(const QString &file)
3519 : QEvent(FileOpen), f(file), m_url(QUrl::fromLocalFile(localfile: file))
3520{
3521}
3522
3523/*!
3524 \internal
3525
3526 Constructs a file open event for the given \a url.
3527*/
3528QFileOpenEvent::QFileOpenEvent(const QUrl &url)
3529 : QEvent(FileOpen), f(url.toLocalFile()), m_url(url)
3530{
3531}
3532
3533
3534/*! \internal
3535*/
3536QFileOpenEvent::~QFileOpenEvent()
3537{
3538}
3539
3540/*!
3541 \fn QString QFileOpenEvent::file() const
3542
3543 Returns the file that is being opened.
3544*/
3545
3546/*!
3547 \fn QUrl QFileOpenEvent::url() const
3548
3549 Returns the url that is being opened.
3550
3551 \since 4.6
3552*/
3553
3554/*!
3555 \fn bool QFileOpenEvent::openFile(QFile &file, QIODevice::OpenMode flags) const
3556
3557 Opens a QFile on the \a file referenced by this event in the mode specified
3558 by \a flags. Returns \c true if successful; otherwise returns \c false.
3559
3560 This is necessary as some files cannot be opened by name, but require specific
3561 information stored in this event.
3562
3563 \since 4.8
3564*/
3565bool QFileOpenEvent::openFile(QFile &file, QIODevice::OpenMode flags) const
3566{
3567 file.setFileName(f);
3568 return file.open(flags);
3569}
3570
3571#ifndef QT_NO_TOOLBAR
3572/*!
3573 \internal
3574 \class QToolBarChangeEvent
3575 \brief The QToolBarChangeEvent class provides an event that is
3576 sent whenever a the toolbar button is clicked on \macos.
3577
3578 \ingroup events
3579 \inmodule QtGui
3580
3581 The QToolBarChangeEvent is sent when the toolbar button is clicked. On
3582 \macos, this is the long oblong button on the right side of the window
3583 title bar. The default implementation is to toggle the appearance (hidden or
3584 shown) of the associated toolbars for the window.
3585*/
3586
3587/*!
3588 \internal
3589
3590 Construct a QToolBarChangeEvent given the current button state in \a state.
3591*/
3592QToolBarChangeEvent::QToolBarChangeEvent(bool t)
3593 : QEvent(ToolBarChange), tog(t)
3594{}
3595
3596/*! \internal
3597*/
3598QToolBarChangeEvent::~QToolBarChangeEvent()
3599{
3600}
3601
3602/*!
3603 \fn bool QToolBarChangeEvent::toggle() const
3604 \internal
3605*/
3606
3607/*
3608 \fn Qt::ButtonState QToolBarChangeEvent::state() const
3609
3610 Returns the keyboard modifier flags at the time of the event.
3611
3612 The returned value is a selection of the following values,
3613 combined using the OR operator:
3614 Qt::ShiftButton, Qt::ControlButton, Qt::MetaButton, and Qt::AltButton.
3615*/
3616
3617#endif // QT_NO_TOOLBAR
3618
3619#ifndef QT_NO_SHORTCUT
3620
3621/*!
3622 Constructs a shortcut event for the given \a key press,
3623 associated with the QShortcut ID \a id.
3624
3625 \a ambiguous specifies whether there is more than one QShortcut
3626 for the same key sequence.
3627*/
3628QShortcutEvent::QShortcutEvent(const QKeySequence &key, int id, bool ambiguous)
3629 : QEvent(Shortcut), sequence(key), ambig(ambiguous), sid(id)
3630{
3631}
3632
3633/*!
3634 Destroys the event object.
3635*/
3636QShortcutEvent::~QShortcutEvent()
3637{
3638}
3639
3640#endif // QT_NO_SHORTCUT
3641
3642#ifndef QT_NO_DEBUG_STREAM
3643
3644static inline void formatTouchEvent(QDebug d, const QTouchEvent &t)
3645{
3646 d << "QTouchEvent(";
3647 QtDebugUtils::formatQEnum(debug&: d, value: t.type());
3648 d << " device: " << t.device()->name();
3649 d << " states: ";
3650 QtDebugUtils::formatQFlags(debug&: d, value: t.touchPointStates());
3651 d << ", " << t.touchPoints().size() << " points: " << t.touchPoints() << ')';
3652}
3653
3654static void formatUnicodeString(QDebug d, const QString &s)
3655{
3656 d << '"' << Qt::hex;
3657 for (int i = 0; i < s.size(); ++i) {
3658 if (i)
3659 d << ',';
3660 d << "U+" << s.at(i).unicode();
3661 }
3662 d << Qt::dec << '"';
3663}
3664
3665static inline void formatInputMethodEvent(QDebug d, const QInputMethodEvent *e)
3666{
3667 d << "QInputMethodEvent(";
3668 if (!e->preeditString().isEmpty()) {
3669 d << "preedit=";
3670 formatUnicodeString(d, s: e->preeditString());
3671 }
3672 if (!e->commitString().isEmpty()) {
3673 d << ", commit=";
3674 formatUnicodeString(d, s: e->commitString());
3675 }
3676 if (e->replacementLength()) {
3677 d << ", replacementStart=" << e->replacementStart() << ", replacementLength="
3678 << e->replacementLength();
3679 }
3680 if (const int attributeCount = e->attributes().size()) {
3681 d << ", attributes= {";
3682 for (int a = 0; a < attributeCount; ++a) {
3683 const QInputMethodEvent::Attribute &at = e->attributes().at(i: a);
3684 if (a)
3685 d << ',';
3686 d << "[type= " << at.type << ", start=" << at.start << ", length=" << at.length
3687 << ", value=" << at.value << ']';
3688 }
3689 d << '}';
3690 }
3691 d << ')';
3692}
3693
3694static inline void formatInputMethodQueryEvent(QDebug d, const QInputMethodQueryEvent *e)
3695{
3696 QDebugStateSaver saver(d);
3697 d.noquote();
3698 const Qt::InputMethodQueries queries = e->queries();
3699 d << "QInputMethodQueryEvent(queries=" << Qt::showbase << Qt::hex << int(queries)
3700 << Qt::noshowbase << Qt::dec << ", {";
3701 for (unsigned mask = 1; mask <= Qt::ImInputItemClipRectangle; mask<<=1) {
3702 if (queries & mask) {
3703 const Qt::InputMethodQuery query = static_cast<Qt::InputMethodQuery>(mask);
3704 const QVariant value = e->value(query);
3705 if (value.isValid()) {
3706 d << '[';
3707 QtDebugUtils::formatQEnum(debug&: d, value: query);
3708 d << '=';
3709 if (query == Qt::ImHints)
3710 QtDebugUtils::formatQFlags(debug&: d, value: Qt::InputMethodHints(value.toInt()));
3711 else
3712 d << value.toString();
3713 d << "],";
3714 }
3715 }
3716 }
3717 d << "})";
3718}
3719
3720static const char *eventClassName(QEvent::Type t)
3721{
3722 switch (t) {
3723 case QEvent::ActionAdded:
3724 case QEvent::ActionRemoved:
3725 case QEvent::ActionChanged:
3726 return "QActionEvent";
3727 case QEvent::MouseButtonPress:
3728 case QEvent::MouseButtonRelease:
3729 case QEvent::MouseButtonDblClick:
3730 case QEvent::MouseMove:
3731 case QEvent::NonClientAreaMouseMove:
3732 case QEvent::NonClientAreaMouseButtonPress:
3733 case QEvent::NonClientAreaMouseButtonRelease:
3734 case QEvent::NonClientAreaMouseButtonDblClick:
3735 return "QMouseEvent";
3736 case QEvent::DragEnter:
3737 return "QDragEnterEvent";
3738 case QEvent::DragMove:
3739 return "QDragMoveEvent";
3740 case QEvent::Drop:
3741 return "QDropEvent";
3742 case QEvent::KeyPress:
3743 case QEvent::KeyRelease:
3744 case QEvent::ShortcutOverride:
3745 return "QKeyEvent";
3746 case QEvent::FocusIn:
3747 case QEvent::FocusOut:
3748 case QEvent::FocusAboutToChange:
3749 return "QFocusEvent";
3750 case QEvent::ChildAdded:
3751 case QEvent::ChildPolished:
3752 case QEvent::ChildRemoved:
3753 return "QChildEvent";
3754 case QEvent::Paint:
3755 return "QPaintEvent";
3756 case QEvent::Move:
3757 return "QMoveEvent";
3758 case QEvent::Resize:
3759 return "QResizeEvent";
3760 case QEvent::Show:
3761 return "QShowEvent";
3762 case QEvent::Hide:
3763 return "QHideEvent";
3764 case QEvent::Enter:
3765 return "QEnterEvent";
3766 case QEvent::Close:
3767 return "QCloseEvent";
3768 case QEvent::FileOpen:
3769 return "QFileOpenEvent";
3770#ifndef QT_NO_GESTURES
3771 case QEvent::NativeGesture:
3772 return "QNativeGestureEvent";
3773 case QEvent::Gesture:
3774 case QEvent::GestureOverride:
3775 return "QGestureEvent";
3776#endif
3777 case QEvent::HoverEnter:
3778 case QEvent::HoverLeave:
3779 case QEvent::HoverMove:
3780 return "QHoverEvent";
3781 case QEvent::TabletEnterProximity:
3782 case QEvent::TabletLeaveProximity:
3783 case QEvent::TabletPress:
3784 case QEvent::TabletMove:
3785 case QEvent::TabletRelease:
3786 return "QTabletEvent";
3787 case QEvent::StatusTip:
3788 return "QStatusTipEvent";
3789 case QEvent::ToolTip:
3790 return "QHelpEvent";
3791 case QEvent::WindowStateChange:
3792 return "QWindowStateChangeEvent";
3793 case QEvent::Wheel:
3794 return "QWheelEvent";
3795 case QEvent::TouchBegin:
3796 case QEvent::TouchUpdate:
3797 case QEvent::TouchEnd:
3798 return "QTouchEvent";
3799 case QEvent::Shortcut:
3800 return "QShortcutEvent";
3801 case QEvent::InputMethod:
3802 return "QInputMethodEvent";
3803 case QEvent::InputMethodQuery:
3804 return "QInputMethodQueryEvent";
3805 case QEvent::OrientationChange:
3806 return "QScreenOrientationChangeEvent";
3807 case QEvent::ScrollPrepare:
3808 return "QScrollPrepareEvent";
3809 case QEvent::Scroll:
3810 return "QScrollEvent";
3811 case QEvent::GraphicsSceneMouseMove:
3812 case QEvent::GraphicsSceneMousePress:
3813 case QEvent::GraphicsSceneMouseRelease:
3814 case QEvent::GraphicsSceneMouseDoubleClick:
3815 return "QGraphicsSceneMouseEvent";
3816 case QEvent::GraphicsSceneContextMenu:
3817 case QEvent::GraphicsSceneHoverEnter:
3818 case QEvent::GraphicsSceneHoverMove:
3819 case QEvent::GraphicsSceneHoverLeave:
3820 case QEvent::GraphicsSceneHelp:
3821 case QEvent::GraphicsSceneDragEnter:
3822 case QEvent::GraphicsSceneDragMove:
3823 case QEvent::GraphicsSceneDragLeave:
3824 case QEvent::GraphicsSceneDrop:
3825 case QEvent::GraphicsSceneWheel:
3826 return "QGraphicsSceneEvent";
3827 case QEvent::Timer:
3828 return "QTimerEvent";
3829 case QEvent::PlatformSurface:
3830 return "QPlatformSurfaceEvent";
3831 default:
3832 break;
3833 }
3834 return "QEvent";
3835}
3836
3837# if QT_CONFIG(draganddrop)
3838
3839static void formatDropEvent(QDebug d, const QDropEvent *e)
3840{
3841 const QEvent::Type type = e->type();
3842 d << eventClassName(t: type) << "(dropAction=";
3843 QtDebugUtils::formatQEnum(debug&: d, value: e->dropAction());
3844 d << ", proposedAction=";
3845 QtDebugUtils::formatQEnum(debug&: d, value: e->proposedAction());
3846 d << ", possibleActions=";
3847 QtDebugUtils::formatQFlags(debug&: d, value: e->possibleActions());
3848 d << ", posF=";
3849 QtDebugUtils::formatQPoint(debug&: d, point: e->posF());
3850 if (type == QEvent::DragMove || type == QEvent::DragEnter)
3851 d << ", answerRect=" << static_cast<const QDragMoveEvent *>(e)->answerRect();
3852 d << ", formats=" << e->mimeData()->formats();
3853 QtDebugUtils::formatNonNullQFlags(debug&: d, prefix: ", keyboardModifiers=", value: e->keyboardModifiers());
3854 d << ", ";
3855 QtDebugUtils::formatQFlags(debug&: d, value: e->mouseButtons());
3856}
3857
3858# endif // QT_CONFIG(draganddrop)
3859
3860# if QT_CONFIG(tabletevent)
3861
3862static void formatTabletEvent(QDebug d, const QTabletEvent *e)
3863{
3864 const QEvent::Type type = e->type();
3865
3866 d << eventClassName(t: type) << '(';
3867 QtDebugUtils::formatQEnum(debug&: d, value: type);
3868 d << ", deviceType=";
3869 QtDebugUtils::formatQEnum(debug&: d, value: e->deviceType());
3870 d << ", pointerType=";
3871 QtDebugUtils::formatQEnum(debug&: d, value: e->pointerType());
3872 d << ", uniqueId=" << e->uniqueId()
3873 << ", pos=" << e->posF()
3874 << ", z=" << e->z()
3875 << ", xTilt=" << e->xTilt()
3876 << ", yTilt=" << e->yTilt()
3877 << ", ";
3878 QtDebugUtils::formatQFlags(debug&: d, value: e->buttons());
3879 if (type == QEvent::TabletPress || type == QEvent::TabletMove)
3880 d << ", pressure=" << e->pressure();
3881 if (e->deviceType() == QTabletEvent::RotationStylus || e->deviceType() == QTabletEvent::FourDMouse)
3882 d << ", rotation=" << e->rotation();
3883 if (e->deviceType() == QTabletEvent::Airbrush)
3884 d << ", tangentialPressure=" << e->tangentialPressure();
3885}
3886
3887# endif // QT_CONFIG(tabletevent)
3888
3889QDebug operator<<(QDebug dbg, const QTouchEvent::TouchPoint &tp)
3890{
3891 QDebugStateSaver saver(dbg);
3892 dbg.nospace();
3893 dbg << "TouchPoint(" << Qt::hex << tp.id() << Qt::dec << " (";
3894 QtDebugUtils::formatQPoint(debug&: dbg, point: tp.pos());
3895 dbg << ") ";
3896 QtDebugUtils::formatQEnum(debug&: dbg, value: tp.state());
3897 dbg << " pressure " << tp.pressure() << " ellipse ("
3898 << tp.ellipseDiameters().width() << " x " << tp.ellipseDiameters().height()
3899 << " angle " << tp.rotation() << ") vel (";
3900 QtDebugUtils::formatQPoint(debug&: dbg, point: tp.velocity().toPointF());
3901 dbg << ") start (";
3902 QtDebugUtils::formatQPoint(debug&: dbg, point: tp.startPos());
3903 dbg << ") last (";
3904 QtDebugUtils::formatQPoint(debug&: dbg, point: tp.lastPos());
3905 dbg << ") delta (";
3906 QtDebugUtils::formatQPoint(debug&: dbg, point: tp.pos() - tp.lastPos());
3907 dbg << ')';
3908 return dbg;
3909}
3910
3911QDebug operator<<(QDebug dbg, const QEvent *e)
3912{
3913 QDebugStateSaver saver(dbg);
3914 dbg.nospace();
3915 if (!e) {
3916 dbg << "QEvent(this = 0x0)";
3917 return dbg;
3918 }
3919 // More useful event output could be added here
3920 const QEvent::Type type = e->type();
3921 switch (type) {
3922 case QEvent::Expose:
3923 dbg << "QExposeEvent(" << static_cast<const QExposeEvent *>(e)->region() << ')';
3924 break;
3925 case QEvent::Paint:
3926 dbg << "QPaintEvent(" << static_cast<const QPaintEvent *>(e)->region() << ')';
3927 break;
3928 case QEvent::MouseButtonPress:
3929 case QEvent::MouseMove:
3930 case QEvent::MouseButtonRelease:
3931 case QEvent::MouseButtonDblClick:
3932 case QEvent::NonClientAreaMouseButtonPress:
3933 case QEvent::NonClientAreaMouseMove:
3934 case QEvent::NonClientAreaMouseButtonRelease:
3935 case QEvent::NonClientAreaMouseButtonDblClick:
3936 {
3937 const QMouseEvent *me = static_cast<const QMouseEvent*>(e);
3938 const Qt::MouseButton button = me->button();
3939 const Qt::MouseButtons buttons = me->buttons();
3940 dbg << "QMouseEvent(";
3941 QtDebugUtils::formatQEnum(debug&: dbg, value: type);
3942 if (type != QEvent::MouseMove && type != QEvent::NonClientAreaMouseMove) {
3943 dbg << ", ";
3944 QtDebugUtils::formatQEnum(debug&: dbg, value: button);
3945 }
3946 if (buttons && button != buttons) {
3947 dbg << ", buttons=";
3948 QtDebugUtils::formatQFlags(debug&: dbg, value: buttons);
3949 }
3950 QtDebugUtils::formatNonNullQFlags(debug&: dbg, prefix: ", ", value: me->modifiers());
3951 dbg << ", localPos=";
3952 QtDebugUtils::formatQPoint(debug&: dbg, point: me->localPos());
3953 dbg << ", screenPos=";
3954 QtDebugUtils::formatQPoint(debug&: dbg, point: me->screenPos());
3955 QtDebugUtils::formatNonNullQEnum(debug&: dbg, prefix: ", ", value: me->source());
3956 QtDebugUtils::formatNonNullQFlags(debug&: dbg, prefix: ", flags=", value: me->flags());
3957 dbg << ')';
3958 }
3959 break;
3960# if QT_CONFIG(wheelevent)
3961 case QEvent::Wheel: {
3962 const QWheelEvent *we = static_cast<const QWheelEvent *>(e);
3963 dbg << "QWheelEvent(" << we->phase();
3964QT_WARNING_PUSH
3965QT_WARNING_DISABLE_DEPRECATED // delta() and orientation()
3966 if (!we->pixelDelta().isNull() || !we->angleDelta().isNull())
3967 dbg << ", pixelDelta=" << we->pixelDelta() << ", angleDelta=" << we->angleDelta();
3968#if QT_DEPRECATED_SINCE(5, 14)
3969 else if (int qt4Delta = we->delta())
3970 dbg << ", delta=" << qt4Delta << ", orientation=" << we->orientation();
3971#endif
3972QT_WARNING_POP
3973 dbg << ')';
3974 }
3975 break;
3976# endif // QT_CONFIG(wheelevent)
3977 case QEvent::KeyPress:
3978 case QEvent::KeyRelease:
3979 case QEvent::ShortcutOverride:
3980 {
3981 const QKeyEvent *ke = static_cast<const QKeyEvent *>(e);
3982 dbg << "QKeyEvent(";
3983 QtDebugUtils::formatQEnum(debug&: dbg, value: type);
3984 dbg << ", ";
3985 QtDebugUtils::formatQEnum(debug&: dbg, value: static_cast<Qt::Key>(ke->key()));
3986 QtDebugUtils::formatNonNullQFlags(debug&: dbg, prefix: ", ", value: ke->modifiers());
3987 if (!ke->text().isEmpty())
3988 dbg << ", text=" << ke->text();
3989 if (ke->isAutoRepeat())
3990 dbg << ", autorepeat, count=" << ke->count();
3991 dbg << ')';
3992 }
3993 break;
3994#ifndef QT_NO_SHORTCUT
3995 case QEvent::Shortcut: {
3996 const QShortcutEvent *se = static_cast<const QShortcutEvent *>(e);
3997 dbg << "QShortcutEvent(" << se->key().toString() << ", id=" << se->shortcutId();
3998 if (se->isAmbiguous())
3999 dbg << ", ambiguous";
4000 dbg << ')';
4001 }
4002 break;
4003#endif
4004 case QEvent::FocusAboutToChange:
4005 case QEvent::FocusIn:
4006 case QEvent::FocusOut:
4007 dbg << "QFocusEvent(";
4008 QtDebugUtils::formatQEnum(debug&: dbg, value: type);
4009 dbg << ", ";
4010 QtDebugUtils::formatQEnum(debug&: dbg, value: static_cast<const QFocusEvent *>(e)->reason());
4011 dbg << ')';
4012 break;
4013 case QEvent::Move: {
4014 const QMoveEvent *me = static_cast<const QMoveEvent *>(e);
4015 dbg << "QMoveEvent(";
4016 QtDebugUtils::formatQPoint(debug&: dbg, point: me->pos());
4017 if (!me->spontaneous())
4018 dbg << ", non-spontaneous";
4019 dbg << ')';
4020 }
4021 break;
4022 case QEvent::Resize: {
4023 const QResizeEvent *re = static_cast<const QResizeEvent *>(e);
4024 dbg << "QResizeEvent(";
4025 QtDebugUtils::formatQSize(debug&: dbg, size: re->size());
4026 if (!re->spontaneous())
4027 dbg << ", non-spontaneous";
4028 dbg << ')';
4029 }
4030 break;
4031# if QT_CONFIG(draganddrop)
4032 case QEvent::DragEnter:
4033 case QEvent::DragMove:
4034 case QEvent::Drop:
4035 formatDropEvent(d: dbg, e: static_cast<const QDropEvent *>(e));
4036 break;
4037# endif // QT_CONFIG(draganddrop)
4038 case QEvent::InputMethod:
4039 formatInputMethodEvent(d: dbg, e: static_cast<const QInputMethodEvent *>(e));
4040 break;
4041 case QEvent::InputMethodQuery:
4042 formatInputMethodQueryEvent(d: dbg, e: static_cast<const QInputMethodQueryEvent *>(e));
4043 break;
4044 case QEvent::TouchBegin:
4045 case QEvent::TouchUpdate:
4046 case QEvent::TouchEnd:
4047 formatTouchEvent(d: dbg, t: *static_cast<const QTouchEvent*>(e));
4048 break;
4049 case QEvent::ChildAdded:
4050 case QEvent::ChildPolished:
4051 case QEvent::ChildRemoved:
4052 dbg << "QChildEvent(";
4053 QtDebugUtils::formatQEnum(debug&: dbg, value: type);
4054 dbg << ", " << (static_cast<const QChildEvent*>(e))->child() << ')';
4055 break;
4056# ifndef QT_NO_GESTURES
4057 case QEvent::NativeGesture: {
4058 const QNativeGestureEvent *ne = static_cast<const QNativeGestureEvent *>(e);
4059 dbg << "QNativeGestureEvent(";
4060 QtDebugUtils::formatQEnum(debug&: dbg, value: ne->gestureType());
4061 dbg << ", localPos=";
4062 QtDebugUtils::formatQPoint(debug&: dbg, point: ne->localPos());
4063 dbg << ", value=" << ne->value() << ')';
4064 }
4065 break;
4066# endif // !QT_NO_GESTURES
4067 case QEvent::ApplicationStateChange:
4068 dbg << "QApplicationStateChangeEvent(";
4069 QtDebugUtils::formatQEnum(debug&: dbg, value: static_cast<const QApplicationStateChangeEvent *>(e)->applicationState());
4070 dbg << ')';
4071 break;
4072# ifndef QT_NO_CONTEXTMENU
4073 case QEvent::ContextMenu:
4074 dbg << "QContextMenuEvent(" << static_cast<const QContextMenuEvent *>(e)->pos() << ')';
4075 break;
4076# endif // !QT_NO_CONTEXTMENU
4077# if QT_CONFIG(tabletevent)
4078 case QEvent::TabletEnterProximity:
4079 case QEvent::TabletLeaveProximity:
4080 case QEvent::TabletPress:
4081 case QEvent::TabletMove:
4082 case QEvent::TabletRelease:
4083 formatTabletEvent(d: dbg, e: static_cast<const QTabletEvent *>(e));
4084 break;
4085# endif // QT_CONFIG(tabletevent)
4086 case QEvent::Enter:
4087 dbg << "QEnterEvent(" << static_cast<const QEnterEvent *>(e)->pos() << ')';
4088 break;
4089 case QEvent::Timer:
4090 dbg << "QTimerEvent(id=" << static_cast<const QTimerEvent *>(e)->timerId() << ')';
4091 break;
4092 case QEvent::PlatformSurface:
4093 dbg << "QPlatformSurfaceEvent(surfaceEventType=";
4094 switch (static_cast<const QPlatformSurfaceEvent *>(e)->surfaceEventType()) {
4095 case QPlatformSurfaceEvent::SurfaceCreated:
4096 dbg << "SurfaceCreated";
4097 break;
4098 case QPlatformSurfaceEvent::SurfaceAboutToBeDestroyed:
4099 dbg << "SurfaceAboutToBeDestroyed";
4100 break;
4101 }
4102 dbg << ')';
4103 break;
4104 case QEvent::ScrollPrepare: {
4105 const QScrollPrepareEvent *se = static_cast<const QScrollPrepareEvent *>(e);
4106 dbg << "QScrollPrepareEvent(viewportSize=" << se->viewportSize()
4107 << ", contentPosRange=" << se->contentPosRange()
4108 << ", contentPos=" << se->contentPos() << ')';
4109 }
4110 break;
4111 case QEvent::Scroll: {
4112 const QScrollEvent *se = static_cast<const QScrollEvent *>(e);
4113 dbg << "QScrollEvent(contentPos=" << se->contentPos()
4114 << ", overshootDistance=" << se->overshootDistance()
4115 << ", scrollState=" << se->scrollState() << ')';
4116 }
4117 break;
4118 default:
4119 dbg << eventClassName(t: type) << '(';
4120 QtDebugUtils::formatQEnum(debug&: dbg, value: type);
4121 dbg << ", " << (const void *)e << ')';
4122 break;
4123 }
4124 return dbg;
4125}
4126#endif // !QT_NO_DEBUG_STREAM
4127
4128/*!
4129 \class QShortcutEvent
4130 \brief The QShortcutEvent class provides an event which is generated when
4131 the user presses a key combination.
4132
4133 \ingroup events
4134 \inmodule QtGui
4135
4136 Normally you do not need to use this class directly; QShortcut
4137 provides a higher-level interface to handle shortcut keys.
4138
4139 \sa QShortcut
4140*/
4141
4142/*!
4143 \fn const QKeySequence &QShortcutEvent::key() const
4144
4145 Returns the key sequence that triggered the event.
4146*/
4147
4148/*!
4149 \fn int QShortcutEvent::shortcutId() const
4150
4151 Returns the ID of the QShortcut object for which this event was
4152 generated.
4153
4154 \sa QShortcut::id()
4155*/
4156
4157/*!
4158 \fn bool QShortcutEvent::isAmbiguous() const
4159
4160 Returns \c true if the key sequence that triggered the event is
4161 ambiguous.
4162
4163 \sa QShortcut::activatedAmbiguously()
4164*/
4165
4166/*!
4167 \class QWindowStateChangeEvent
4168 \ingroup events
4169 \inmodule QtGui
4170
4171 \brief The QWindowStateChangeEvent class provides the window state before a
4172 window state change.
4173*/
4174
4175/*! \fn Qt::WindowStates QWindowStateChangeEvent::oldState() const
4176
4177 Returns the state of the window before the change.
4178*/
4179
4180/*! \internal
4181 */
4182QWindowStateChangeEvent::QWindowStateChangeEvent(Qt::WindowStates s, bool isOverride)
4183 : QEvent(WindowStateChange), ostate(s), m_override(isOverride)
4184{
4185}
4186
4187/*! \internal
4188 */
4189bool QWindowStateChangeEvent::isOverride() const
4190{
4191 return m_override;
4192}
4193
4194/*! \internal
4195*/
4196QWindowStateChangeEvent::~QWindowStateChangeEvent()
4197{
4198}
4199
4200
4201/*!
4202 \class QTouchEvent
4203 \brief The QTouchEvent class contains parameters that describe a touch event.
4204 \since 4.6
4205 \ingroup events
4206 \ingroup touch
4207 \inmodule QtGui
4208
4209 \section1 Enabling Touch Events
4210
4211 Touch events occur when pressing, releasing, or moving one or more touch points on a touch
4212 device (such as a touch-screen or track-pad). To receive touch events, widgets have to have the
4213 Qt::WA_AcceptTouchEvents attribute set and graphics items need to have the
4214 \l{QGraphicsItem::setAcceptTouchEvents()}{acceptTouchEvents} attribute set to true.
4215
4216 When using QAbstractScrollArea based widgets, you should enable the Qt::WA_AcceptTouchEvents
4217 attribute on the scroll area's \l{QAbstractScrollArea::viewport()}{viewport}.
4218
4219 Similarly to QMouseEvent, Qt automatically grabs each touch point on the first press inside a
4220 widget, and the widget will receive all updates for the touch point until it is released.
4221 Note that it is possible for a widget to receive events for numerous touch points, and that
4222 multiple widgets may be receiving touch events at the same time.
4223
4224 \section1 Event Handling
4225
4226 All touch events are of type QEvent::TouchBegin, QEvent::TouchUpdate, QEvent::TouchEnd or
4227 QEvent::TouchCancel. Reimplement QWidget::event() or QAbstractScrollArea::viewportEvent() for
4228 widgets and QGraphicsItem::sceneEvent() for items in a graphics view to receive touch events.
4229
4230 Unlike widgets, QWindows receive touch events always, there is no need to opt in. When working
4231 directly with a QWindow, it is enough to reimplement QWindow::touchEvent().
4232
4233 The QEvent::TouchUpdate and QEvent::TouchEnd events are sent to the widget or item that
4234 accepted the QEvent::TouchBegin event. If the QEvent::TouchBegin event is not accepted and not
4235 filtered by an event filter, then no further touch events are sent until the next
4236 QEvent::TouchBegin.
4237
4238 Some systems may send an event of type QEvent::TouchCancel. Upon receiving this event
4239 applications are requested to ignore the entire active touch sequence. For example in a
4240 composited system the compositor may decide to treat certain gestures as system-wide
4241 gestures. Whenever such a decision is made (the gesture is recognized), the clients will be
4242 notified with a QEvent::TouchCancel event so they can update their state accordingly.
4243
4244 The touchPoints() function returns a list of all touch points contained in the event. Note that
4245 this list may be empty, for example in case of a QEvent::TouchCancel event. Information about
4246 each touch point can be retrieved using the QTouchEvent::TouchPoint class. The
4247 Qt::TouchPointState enum describes the different states that a touch point may have.
4248
4249 \note The list of touchPoints() will never be partial: A touch event will always contain a touch
4250 point for each existing physical touch contacts targetting the window or widget to which the
4251 event is sent. For instance, assuming that all touches target the same window or widget, an
4252 event with a condition of touchPoints().count()==2 is guaranteed to imply that the number of
4253 fingers touching the touchscreen or touchpad is exactly two.
4254
4255 \section1 Event Delivery and Propagation
4256
4257 By default, QGuiApplication translates the first touch point in a QTouchEvent into
4258 a QMouseEvent. This makes it possible to enable touch events on existing widgets that do not
4259 normally handle QTouchEvent. See below for information on some special considerations needed
4260 when doing this.
4261
4262 QEvent::TouchBegin is the first touch event sent to a widget. The QEvent::TouchBegin event
4263 contains a special accept flag that indicates whether the receiver wants the event. By default,
4264 the event is accepted. You should call ignore() if the touch event is not handled by your
4265 widget. The QEvent::TouchBegin event is propagated up the parent widget chain until a widget
4266 accepts it with accept(), or an event filter consumes it. For QGraphicsItems, the
4267 QEvent::TouchBegin event is propagated to items under the mouse (similar to mouse event
4268 propagation for QGraphicsItems).
4269
4270 \section1 Touch Point Grouping
4271
4272 As mentioned above, it is possible that several widgets can be receiving QTouchEvents at the
4273 same time. However, Qt makes sure to never send duplicate QEvent::TouchBegin events to the same
4274 widget, which could theoretically happen during propagation if, for example, the user touched 2
4275 separate widgets in a QGroupBox and both widgets ignored the QEvent::TouchBegin event.
4276
4277 To avoid this, Qt will group new touch points together using the following rules:
4278
4279 \list
4280
4281 \li When the first touch point is detected, the destination widget is determined firstly by the
4282 location on screen and secondly by the propagation rules.
4283
4284 \li When additional touch points are detected, Qt first looks to see if there are any active
4285 touch points on any ancestor or descendent of the widget under the new touch point. If there
4286 are, the new touch point is grouped with the first, and the new touch point will be sent in a
4287 single QTouchEvent to the widget that handled the first touch point. (The widget under the new
4288 touch point will not receive an event).
4289
4290 \endlist
4291
4292 This makes it possible for sibling widgets to handle touch events independently while making
4293 sure that the sequence of QTouchEvents is always correct.
4294
4295 \section1 Mouse Events and Touch Event Synthesizing
4296
4297 QTouchEvent delivery is independent from that of QMouseEvent. The application flags
4298 Qt::AA_SynthesizeTouchForUnhandledMouseEvents and Qt::AA_SynthesizeMouseForUnhandledTouchEvents
4299 can be used to enable or disable automatic synthesizing of touch events to mouse events and
4300 mouse events to touch events.
4301
4302 \section1 Caveats
4303
4304 \list
4305
4306 \li As mentioned above, enabling touch events means multiple widgets can be receiving touch
4307 events simultaneously. Combined with the default QWidget::event() handling for QTouchEvents,
4308 this gives you great flexibility in designing touch user interfaces. Be aware of the
4309 implications. For example, it is possible that the user is moving a QSlider with one finger and
4310 pressing a QPushButton with another. The signals emitted by these widgets will be
4311 interleaved.
4312
4313 \li Recursion into the event loop using one of the exec() methods (e.g., QDialog::exec() or
4314 QMenu::exec()) in a QTouchEvent event handler is not supported. Since there are multiple event
4315 recipients, recursion may cause problems, including but not limited to lost events
4316 and unexpected infinite recursion.
4317
4318 \li QTouchEvents are not affected by a \l{QWidget::grabMouse()}{mouse grab} or an
4319 \l{QApplication::activePopupWidget()}{active pop-up widget}. The behavior of QTouchEvents is
4320 undefined when opening a pop-up or grabbing the mouse while there are more than one active touch
4321 points.
4322
4323 \endlist
4324
4325 \sa QTouchEvent::TouchPoint, Qt::TouchPointState, Qt::WA_AcceptTouchEvents,
4326 QGraphicsItem::acceptTouchEvents()
4327*/
4328
4329/*!
4330 Constructs a QTouchEvent with the given \a eventType, \a device, and
4331 \a touchPoints. The \a touchPointStates and \a modifiers
4332 are the current touch point states and keyboard modifiers at the time of
4333 the event.
4334*/
4335QTouchEvent::QTouchEvent(QEvent::Type eventType,
4336 QTouchDevice *device,
4337 Qt::KeyboardModifiers modifiers,
4338 Qt::TouchPointStates touchPointStates,
4339 const QList<QTouchEvent::TouchPoint> &touchPoints)
4340 : QInputEvent(eventType, modifiers),
4341 _window(nullptr),
4342 _target(nullptr),
4343 _device(device),
4344 _touchPointStates(touchPointStates),
4345 _touchPoints(touchPoints)
4346{ }
4347
4348/*!
4349 Destroys the QTouchEvent.
4350*/
4351QTouchEvent::~QTouchEvent()
4352{ }
4353
4354/*! \fn QWindow *QTouchEvent::window() const
4355
4356 Returns the window on which the event occurred. Useful for doing
4357 global-local mapping on data like rawScreenPositions() which,
4358 for performance reasons, only stores the global positions in the
4359 touch event.
4360*/
4361
4362/*! \fn QObject *QTouchEvent::target() const
4363
4364 Returns the target object within the window on which the event occurred.
4365 This is typically a QWidget or a QQuickItem. May be 0 when no specific target is available.
4366*/
4367
4368/*! \fn QTouchEvent::TouchPoint::TouchPoint(TouchPoint &&other)
4369
4370 Move-constructs a TouchPoint instance, making it point to the same
4371 object that \a other was pointing to.
4372*/
4373
4374/*! \fn Qt::TouchPointStates QTouchEvent::touchPointStates() const
4375
4376 Returns a bitwise OR of all the touch point states for this event.
4377*/
4378
4379/*! \fn const QList<QTouchEvent::TouchPoint> &QTouchEvent::touchPoints() const
4380
4381 Returns the list of touch points contained in the touch event.
4382*/
4383
4384/*! \fn QTouchDevice* QTouchEvent::device() const
4385
4386 Returns the touch device from which this touch event originates.
4387*/
4388
4389/*! \fn void QTouchEvent::setWindow(QWindow *window)
4390
4391 \internal
4392
4393 Sets the window for this event.
4394*/
4395
4396/*! \fn void QTouchEvent::setTarget(QObject *target)
4397
4398 \internal
4399
4400 Sets the target within the window (typically a widget) for this event.
4401*/
4402
4403/*! \fn void QTouchEvent::setTouchPointStates(Qt::TouchPointStates touchPointStates)
4404
4405 \internal
4406
4407 Sets a bitwise OR of all the touch point states for this event.
4408*/
4409
4410/*! \fn void QTouchEvent::setTouchPoints(const QList<QTouchEvent::TouchPoint> &touchPoints)
4411
4412 \internal
4413
4414 Sets the list of touch points for this event.
4415*/
4416
4417/*! \fn void QTouchEvent::setDevice(QTouchDevice *adevice)
4418
4419 \internal
4420
4421 Sets the device to \a adevice.
4422*/
4423
4424/*! \class QTouchEvent::TouchPoint
4425 \brief The TouchPoint class provides information about a touch point in a QTouchEvent.
4426 \since 4.6
4427 \inmodule QtGui
4428
4429 \image touchpoint-metrics.png
4430*/
4431
4432/*! \enum TouchPoint::InfoFlag
4433
4434 The values of this enum describe additional information about a touch point.
4435
4436 \value Pen Indicates that the contact has been made by a designated pointing device (e.g. a pen) instead of a finger.
4437 \value Token Indicates that the contact has been made by a fiducial object (e.g. a knob or other token) instead of a finger.
4438*/
4439
4440/*!
4441 \internal
4442
4443 Constructs a QTouchEvent::TouchPoint for use in a QTouchEvent.
4444*/
4445QTouchEvent::TouchPoint::TouchPoint(int id)
4446 : d(new QTouchEventTouchPointPrivate(id))
4447{ }
4448
4449/*!
4450 \fn QTouchEvent::TouchPoint::TouchPoint(const QTouchEvent::TouchPoint &other)
4451 \internal
4452
4453 Constructs a copy of \a other.
4454*/
4455QTouchEvent::TouchPoint::TouchPoint(const QTouchEvent::TouchPoint &other)
4456 : d(other.d)
4457{
4458 d->ref.ref();
4459}
4460
4461/*!
4462 \internal
4463
4464 Destroys the QTouchEvent::TouchPoint.
4465*/
4466QTouchEvent::TouchPoint::~TouchPoint()
4467{
4468 if (d && !d->ref.deref())
4469 delete d;
4470}
4471
4472/*!
4473 Returns the id number of this touch point.
4474
4475 Do not assume that id numbers start at zero or that they are sequential.
4476 Such an assumption is often false due to the way the underlying drivers work.
4477*/
4478int QTouchEvent::TouchPoint::id() const
4479{
4480 return d->id;
4481}
4482
4483/*!
4484 \since 5.8
4485 Returns the unique ID of this touch point or token, if any.
4486
4487 It is normally invalid (see \l {QPointingDeviceUniqueId::isValid()} {isValid()}),
4488 because touchscreens cannot uniquely identify fingers. But when the
4489 \l {TouchPoint::InfoFlag} {Token} flag is set, it is expected to uniquely
4490 identify a specific token (fiducial object).
4491
4492 \sa flags
4493*/
4494QPointingDeviceUniqueId QTouchEvent::TouchPoint::uniqueId() const
4495{
4496 return d->uniqueId;
4497}
4498
4499/*!
4500 Returns the current state of this touch point.
4501*/
4502Qt::TouchPointState QTouchEvent::TouchPoint::state() const
4503{
4504 return Qt::TouchPointState(int(d->state));
4505}
4506
4507/*!
4508 Returns the position of this touch point, relative to the widget
4509 or QGraphicsItem that received the event.
4510
4511 \sa startPos(), lastPos(), screenPos(), scenePos(), normalizedPos()
4512*/
4513QPointF QTouchEvent::TouchPoint::pos() const
4514{
4515 return d->pos;
4516}
4517
4518/*!
4519 Returns the scene position of this touch point.
4520
4521 The scene position is the position in QGraphicsScene coordinates
4522 if the QTouchEvent is handled by a QGraphicsItem::touchEvent()
4523 reimplementation, and identical to the screen position for
4524 widgets.
4525
4526 \sa startScenePos(), lastScenePos(), pos()
4527*/
4528QPointF QTouchEvent::TouchPoint::scenePos() const
4529{
4530 return d->scenePos;
4531}
4532
4533/*!
4534 Returns the screen position of this touch point.
4535
4536 \sa startScreenPos(), lastScreenPos(), pos()
4537*/
4538QPointF QTouchEvent::TouchPoint::screenPos() const
4539{
4540 return d->screenPos;
4541}
4542
4543/*!
4544 Returns the normalized position of this touch point.
4545
4546 The coordinates are normalized to the size of the touch device,
4547 i.e. (0,0) is the top-left corner and (1,1) is the bottom-right corner.
4548
4549 \sa startNormalizedPos(), lastNormalizedPos(), pos()
4550*/
4551QPointF QTouchEvent::TouchPoint::normalizedPos() const
4552{
4553 return d->normalizedPos;
4554}
4555
4556/*!
4557 Returns the starting position of this touch point, relative to the
4558 widget or QGraphicsItem that received the event.
4559
4560 \sa pos(), lastPos()
4561*/
4562QPointF QTouchEvent::TouchPoint::startPos() const
4563{
4564 return d->startPos;
4565}
4566
4567/*!
4568 Returns the starting scene position of this touch point.
4569
4570 The scene position is the position in QGraphicsScene coordinates
4571 if the QTouchEvent is handled by a QGraphicsItem::touchEvent()
4572 reimplementation, and identical to the screen position for
4573 widgets.
4574
4575 \sa scenePos(), lastScenePos()
4576*/
4577QPointF QTouchEvent::TouchPoint::startScenePos() const
4578{
4579 return d->startScenePos;
4580}
4581
4582/*!
4583 Returns the starting screen position of this touch point.
4584
4585 \sa screenPos(), lastScreenPos()
4586*/
4587QPointF QTouchEvent::TouchPoint::startScreenPos() const
4588{
4589 return d->startScreenPos;
4590}
4591
4592/*!
4593 Returns the normalized starting position of this touch point.
4594
4595 The coordinates are normalized to the size of the touch device,
4596 i.e. (0,0) is the top-left corner and (1,1) is the bottom-right corner.
4597
4598 \sa normalizedPos(), lastNormalizedPos()
4599*/
4600QPointF QTouchEvent::TouchPoint::startNormalizedPos() const
4601{
4602 return d->startNormalizedPos;
4603}
4604
4605/*!
4606 Returns the position of this touch point from the previous touch
4607 event, relative to the widget or QGraphicsItem that received the event.
4608
4609 \sa pos(), startPos()
4610*/
4611QPointF QTouchEvent::TouchPoint::lastPos() const
4612{
4613 return d->lastPos;
4614}
4615
4616/*!
4617 Returns the scene position of this touch point from the previous
4618 touch event.
4619
4620 The scene position is the position in QGraphicsScene coordinates
4621 if the QTouchEvent is handled by a QGraphicsItem::touchEvent()
4622 reimplementation, and identical to the screen position for
4623 widgets.
4624
4625 \sa scenePos(), startScenePos()
4626*/
4627QPointF QTouchEvent::TouchPoint::lastScenePos() const
4628{
4629 return d->lastScenePos;
4630}
4631
4632/*!
4633 Returns the screen position of this touch point from the previous
4634 touch event.
4635
4636 \sa screenPos(), startScreenPos()
4637*/
4638QPointF QTouchEvent::TouchPoint::lastScreenPos() const
4639{
4640 return d->lastScreenPos;
4641}
4642
4643/*!
4644 Returns the normalized position of this touch point from the
4645 previous touch event.
4646
4647 The coordinates are normalized to the size of the touch device,
4648 i.e. (0,0) is the top-left corner and (1,1) is the bottom-right corner.
4649
4650 \sa normalizedPos(), startNormalizedPos()
4651*/
4652QPointF QTouchEvent::TouchPoint::lastNormalizedPos() const
4653{
4654 return d->lastNormalizedPos;
4655}
4656
4657#if QT_DEPRECATED_SINCE(5, 15)
4658/*!
4659 \deprecated This function is deprecated since 5.9 because it returns the outer bounds
4660 of the touchpoint regardless of rotation, whereas a touchpoint is more correctly
4661 modeled as an ellipse at position pos() with ellipseDiameters()
4662 which are independent of rotation().
4663*/
4664QRectF QTouchEvent::TouchPoint::rect() const
4665{
4666 QRectF ret(QPointF(), d->ellipseDiameters);
4667 ret.moveCenter(p: d->pos);
4668 return ret;
4669}
4670
4671/*!
4672 \deprecated This function is deprecated since 5.9 because it returns the outer bounds
4673 of the touchpoint regardless of rotation, whereas a touchpoint is more correctly
4674 modeled as an ellipse at position scenePos() with ellipseDiameters()
4675 which are independent of rotation().
4676*/
4677QRectF QTouchEvent::TouchPoint::sceneRect() const
4678{
4679 QRectF ret(QPointF(), d->ellipseDiameters);
4680 ret.moveCenter(p: d->scenePos);
4681 return ret;
4682}
4683
4684/*!
4685 \deprecated This function is deprecated since 5.9 because it returns the outer bounds of the
4686 touchpoint regardless of rotation, whereas a touchpoint is more correctly
4687 modeled as an ellipse at position screenPos() with ellipseDiameters()
4688 which are independent of rotation().
4689*/
4690QRectF QTouchEvent::TouchPoint::screenRect() const
4691{
4692 QRectF ret(QPointF(), d->ellipseDiameters);
4693 ret.moveCenter(p: d->screenPos);
4694 return ret;
4695}
4696#endif
4697
4698/*!
4699 Returns the pressure of this touch point. The return value is in
4700 the range 0.0 to 1.0.
4701*/
4702qreal QTouchEvent::TouchPoint::pressure() const
4703{
4704 return d->pressure;
4705}
4706
4707/*!
4708 \since 5.8
4709 Returns the angular orientation of this touch point. The return value is in degrees,
4710 where zero (the default) indicates the finger or token is pointing upwards,
4711 a negative angle means it's rotated to the left, and a positive angle means
4712 it's rotated to the right. Most touchscreens do not detect rotation, so
4713 zero is the most common value.
4714*/
4715qreal QTouchEvent::TouchPoint::rotation() const
4716{
4717 return d->rotation;
4718}
4719
4720/*!
4721 \since 5.9
4722 Returns the width and height of the bounding ellipse of this touch point.
4723 The return value is in logical pixels. Most touchscreens do not detect the
4724 shape of the contact point, so a null size is the most common value.
4725 In other cases the diameters may be nonzero and equal (the ellipse is
4726 approximated as a circle).
4727*/
4728QSizeF QTouchEvent::TouchPoint::ellipseDiameters() const
4729{
4730 return d->ellipseDiameters;
4731}
4732
4733/*!
4734 Returns a velocity vector for this touch point.
4735 The vector is in the screen's coordinate system, using pixels per seconds for the magnitude.
4736
4737 \note The returned vector is only valid if the touch device's capabilities include QTouchDevice::Velocity.
4738
4739 \sa QTouchDevice::capabilities(), device()
4740*/
4741QVector2D QTouchEvent::TouchPoint::velocity() const
4742{
4743 return d->velocity;
4744}
4745
4746/*!
4747 Returns additional information about the touch point.
4748
4749 \sa QTouchEvent::TouchPoint::InfoFlags
4750 */
4751QTouchEvent::TouchPoint::InfoFlags QTouchEvent::TouchPoint::flags() const
4752{
4753 return d->flags;
4754}
4755
4756/*!
4757 \since 5.0
4758 Returns the raw, unfiltered positions for the touch point. The positions are in native screen coordinates.
4759 To get local coordinates you can use mapFromGlobal() of the QWindow returned by QTouchEvent::window().
4760
4761 \note Returns an empty vector if the touch device's capabilities do not include QTouchDevice::RawPositions.
4762
4763 \note Native screen coordinates refer to the native orientation of the screen which, in case of
4764 mobile devices, is typically portrait. This means that on systems capable of screen orientation
4765 changes the positions in this list will not reflect the current orientation (unlike pos(),
4766 screenPos(), etc.) and will always be reported in the native orientation.
4767
4768 \sa QTouchDevice::capabilities(), device(), window()
4769 */
4770QVector<QPointF> QTouchEvent::TouchPoint::rawScreenPositions() const
4771{
4772 return d->rawScreenPositions;
4773}
4774
4775/*! \internal */
4776void QTouchEvent::TouchPoint::setId(int id)
4777{
4778 if (d->ref.loadRelaxed() != 1)
4779 d = d->detach();
4780 d->id = id;
4781}
4782
4783/*! \internal */
4784void QTouchEvent::TouchPoint::setUniqueId(qint64 uid)
4785{
4786 if (d->ref.loadRelaxed() != 1)
4787 d = d->detach();
4788 d->uniqueId = QPointingDeviceUniqueId::fromNumericId(id: uid);
4789}
4790
4791/*! \internal */
4792void QTouchEvent::TouchPoint::setState(Qt::TouchPointStates state)
4793{
4794 if (d->ref.loadRelaxed() != 1)
4795 d = d->detach();
4796 d->state = state;
4797}
4798
4799/*! \internal */
4800void QTouchEvent::TouchPoint::setPos(const QPointF &pos)
4801{
4802 if (d->ref.loadRelaxed() != 1)
4803 d = d->detach();
4804 d->pos = pos;
4805}
4806
4807/*! \internal */
4808void QTouchEvent::TouchPoint::setScenePos(const QPointF &scenePos)
4809{
4810 if (d->ref.loadRelaxed() != 1)
4811 d = d->detach();
4812 d->scenePos = scenePos;
4813}
4814
4815/*! \internal */
4816void QTouchEvent::TouchPoint::setScreenPos(const QPointF &screenPos)
4817{
4818 if (d->ref.loadRelaxed() != 1)
4819 d = d->detach();
4820 d->screenPos = screenPos;
4821}
4822
4823/*! \internal */
4824void QTouchEvent::TouchPoint::setNormalizedPos(const QPointF &normalizedPos)
4825{
4826 if (d->ref.loadRelaxed() != 1)
4827 d = d->detach();
4828 d->normalizedPos = normalizedPos;
4829}
4830
4831/*! \internal */
4832void QTouchEvent::TouchPoint::setStartPos(const QPointF &startPos)
4833{
4834 if (d->ref.loadRelaxed() != 1)
4835 d = d->detach();
4836 d->startPos = startPos;
4837}
4838
4839/*! \internal */
4840void QTouchEvent::TouchPoint::setStartScenePos(const QPointF &startScenePos)
4841{
4842 if (d->ref.loadRelaxed() != 1)
4843 d = d->detach();
4844 d->startScenePos = startScenePos;
4845}
4846
4847/*! \internal */
4848void QTouchEvent::TouchPoint::setStartScreenPos(const QPointF &startScreenPos)
4849{
4850 if (d->ref.loadRelaxed() != 1)
4851 d = d->detach();
4852 d->startScreenPos = startScreenPos;
4853}
4854
4855/*! \internal */
4856void QTouchEvent::TouchPoint::setStartNormalizedPos(const QPointF &startNormalizedPos)
4857{
4858 if (d->ref.loadRelaxed() != 1)
4859 d = d->detach();
4860 d->startNormalizedPos = startNormalizedPos;
4861}
4862
4863/*! \internal */
4864void QTouchEvent::TouchPoint::setLastPos(const QPointF &lastPos)
4865{
4866 if (d->ref.loadRelaxed() != 1)
4867 d = d->detach();
4868 d->lastPos = lastPos;
4869}
4870
4871/*! \internal */
4872void QTouchEvent::TouchPoint::setLastScenePos(const QPointF &lastScenePos)
4873{
4874 if (d->ref.loadRelaxed() != 1)
4875 d = d->detach();
4876 d->lastScenePos = lastScenePos;
4877}
4878
4879/*! \internal */
4880void QTouchEvent::TouchPoint::setLastScreenPos(const QPointF &lastScreenPos)
4881{
4882 if (d->ref.loadRelaxed() != 1)
4883 d = d->detach();
4884 d->lastScreenPos = lastScreenPos;
4885}
4886
4887/*! \internal */
4888void QTouchEvent::TouchPoint::setLastNormalizedPos(const QPointF &lastNormalizedPos)
4889{
4890 if (d->ref.loadRelaxed() != 1)
4891 d = d->detach();
4892 d->lastNormalizedPos = lastNormalizedPos;
4893}
4894
4895#if QT_DEPRECATED_SINCE(5, 15)
4896// ### remove the following 3 setRect functions and their usages soon
4897/*! \internal
4898 \obsolete
4899*/
4900void QTouchEvent::TouchPoint::setRect(const QRectF &rect)
4901{
4902 if (d->ref.loadRelaxed() != 1)
4903 d = d->detach();
4904 d->pos = rect.center();
4905 d->ellipseDiameters = rect.size();
4906}
4907
4908/*! \internal
4909 \obsolete
4910*/
4911void QTouchEvent::TouchPoint::setSceneRect(const QRectF &sceneRect)
4912{
4913 if (d->ref.loadRelaxed() != 1)
4914 d = d->detach();
4915 d->scenePos = sceneRect.center();
4916 d->ellipseDiameters = sceneRect.size();
4917}
4918
4919/*! \internal
4920 \obsolete
4921*/
4922void QTouchEvent::TouchPoint::setScreenRect(const QRectF &screenRect)
4923{
4924 if (d->ref.loadRelaxed() != 1)
4925 d = d->detach();
4926 d->screenPos = screenRect.center();
4927 d->ellipseDiameters = screenRect.size();
4928}
4929#endif
4930
4931/*! \internal */
4932void QTouchEvent::TouchPoint::setPressure(qreal pressure)
4933{
4934 if (d->ref.loadRelaxed() != 1)
4935 d = d->detach();
4936 d->pressure = pressure;
4937}
4938
4939/*! \internal */
4940void QTouchEvent::TouchPoint::setRotation(qreal angle)
4941{
4942 if (d->ref.loadRelaxed() != 1)
4943 d = d->detach();
4944 d->rotation = angle;
4945}
4946
4947/*! \internal */
4948void QTouchEvent::TouchPoint::setEllipseDiameters(const QSizeF &dia)
4949{
4950 if (d->ref.loadRelaxed() != 1)
4951 d = d->detach();
4952 d->ellipseDiameters = dia;
4953}
4954
4955/*! \internal */
4956void QTouchEvent::TouchPoint::setVelocity(const QVector2D &v)
4957{
4958 if (d->ref.loadRelaxed() != 1)
4959 d = d->detach();
4960 d->velocity = v;
4961}
4962
4963/*! \internal */
4964void QTouchEvent::TouchPoint::setRawScreenPositions(const QVector<QPointF> &positions)
4965{
4966 if (d->ref.loadRelaxed() != 1)
4967 d = d->detach();
4968 d->rawScreenPositions = positions;
4969}
4970
4971/*!
4972 \internal
4973*/
4974void QTouchEvent::TouchPoint::setFlags(InfoFlags flags)
4975{
4976 if (d->ref.loadRelaxed() != 1)
4977 d = d->detach();
4978 d->flags = flags;
4979}
4980
4981/*!
4982 \fn QTouchEvent::TouchPoint &QTouchEvent::TouchPoint::operator=(const QTouchEvent::TouchPoint &other)
4983 \internal
4984 */
4985
4986/*!
4987 \fn QTouchEvent::TouchPoint &QTouchEvent::TouchPoint::operator=(QTouchEvent::TouchPoint &&other)
4988 \internal
4989 */
4990/*!
4991 \fn void QTouchEvent::TouchPoint::swap(TouchPoint &other);
4992 \internal
4993*/
4994
4995/*!
4996 \class QScrollPrepareEvent
4997 \since 4.8
4998 \ingroup events
4999 \inmodule QtGui
5000
5001 \brief The QScrollPrepareEvent class is sent in preparation of scrolling.
5002
5003 The scroll prepare event is sent before scrolling (usually by QScroller) is started.
5004 The object receiving this event should set viewportSize, maxContentPos and contentPos.
5005 It also should accept this event to indicate that scrolling should be started.
5006
5007 It is not guaranteed that a QScrollEvent will be sent after an acceepted
5008 QScrollPrepareEvent, e.g. in a case where the maximum content position is (0,0).
5009
5010 \sa QScrollEvent, QScroller
5011*/
5012
5013/*!
5014 Creates new QScrollPrepareEvent
5015 The \a startPos is the position of a touch or mouse event that started the scrolling.
5016*/
5017QScrollPrepareEvent::QScrollPrepareEvent(const QPointF &startPos)
5018 : QEvent(QEvent::ScrollPrepare), m_target(nullptr), m_startPos(startPos)
5019{
5020 Q_UNUSED(m_target);
5021}
5022
5023/*!
5024 Destroys QScrollEvent.
5025*/
5026QScrollPrepareEvent::~QScrollPrepareEvent()
5027{
5028}
5029
5030/*!
5031 Returns the position of the touch or mouse event that started the scrolling.
5032*/
5033QPointF QScrollPrepareEvent::startPos() const
5034{
5035 return m_startPos;
5036}
5037
5038/*!
5039 Returns size of the area that is to be scrolled as set by setViewportSize
5040
5041 \sa setViewportSize()
5042*/
5043QSizeF QScrollPrepareEvent::viewportSize() const
5044{
5045 return m_viewportSize;
5046}
5047
5048/*!
5049 Returns the range of coordinates for the content as set by setContentPosRange().
5050*/
5051QRectF QScrollPrepareEvent::contentPosRange() const
5052{
5053 return m_contentPosRange;
5054}
5055
5056/*!
5057 Returns the current position of the content as set by setContentPos.
5058*/
5059QPointF QScrollPrepareEvent::contentPos() const
5060{
5061 return m_contentPos;
5062}
5063
5064
5065/*!
5066 Sets the size of the area that is to be scrolled to \a size.
5067
5068 \sa viewportSize()
5069*/
5070void QScrollPrepareEvent::setViewportSize(const QSizeF &size)
5071{
5072 m_viewportSize = size;
5073}
5074
5075/*!
5076 Sets the range of content coordinates to \a rect.
5077
5078 \sa contentPosRange()
5079*/
5080void QScrollPrepareEvent::setContentPosRange(const QRectF &rect)
5081{
5082 m_contentPosRange = rect;
5083}
5084
5085/*!
5086 Sets the current content position to \a pos.
5087
5088 \sa contentPos()
5089*/
5090void QScrollPrepareEvent::setContentPos(const QPointF &pos)
5091{
5092 m_contentPos = pos;
5093}
5094
5095
5096/*!
5097 \class QScrollEvent
5098 \since 4.8
5099 \ingroup events
5100 \inmodule QtGui
5101
5102 \brief The QScrollEvent class is sent when scrolling.
5103
5104 The scroll event is sent to indicate that the receiver should be scrolled.
5105 Usually the receiver should be something visual like QWidget or QGraphicsObject.
5106
5107 Some care should be taken that no conflicting QScrollEvents are sent from two
5108 sources. Using QScroller::scrollTo is save however.
5109
5110 \sa QScrollPrepareEvent, QScroller
5111*/
5112
5113/*!
5114 \enum QScrollEvent::ScrollState
5115
5116 This enum describes the states a scroll event can have.
5117
5118 \value ScrollStarted Set for the first scroll event of a scroll activity.
5119
5120 \value ScrollUpdated Set for all but the first and the last scroll event of a scroll activity.
5121
5122 \value ScrollFinished Set for the last scroll event of a scroll activity.
5123
5124 \sa QScrollEvent::scrollState()
5125*/
5126
5127/*!
5128 Creates a new QScrollEvent
5129 \a contentPos is the new content position, \a overshootDistance is the
5130 new overshoot distance while \a scrollState indicates if this scroll
5131 event is the first one, the last one or some event in between.
5132*/
5133QScrollEvent::QScrollEvent(const QPointF &contentPos, const QPointF &overshootDistance, ScrollState scrollState)
5134 : QEvent(QEvent::Scroll), m_contentPos(contentPos), m_overshoot(overshootDistance), m_state(scrollState)
5135{
5136}
5137
5138/*!
5139 Destroys QScrollEvent.
5140*/
5141QScrollEvent::~QScrollEvent()
5142{
5143}
5144
5145/*!
5146 Returns the new scroll position.
5147*/
5148QPointF QScrollEvent::contentPos() const
5149{
5150 return m_contentPos;
5151}
5152
5153/*!
5154 Returns the new overshoot distance.
5155 See QScroller for an explanation of the term overshoot.
5156
5157 \sa QScroller
5158*/
5159QPointF QScrollEvent::overshootDistance() const
5160{
5161 return m_overshoot;
5162}
5163
5164/*!
5165 Returns the current scroll state as a combination of ScrollStateFlag values.
5166 ScrollStarted (or ScrollFinished) will be set, if this scroll event is the first (or last) event in a scrolling activity.
5167 Please note that both values can be set at the same time, if the activity consists of a single QScrollEvent.
5168 All other scroll events in between will have their state set to ScrollUpdated.
5169
5170 A widget could for example revert selections when scrolling is started and stopped.
5171*/
5172QScrollEvent::ScrollState QScrollEvent::scrollState() const
5173{
5174 return m_state;
5175}
5176
5177/*!
5178 Creates a new QScreenOrientationChangeEvent
5179 \a screenOrientation is the new orientation of the \a screen.
5180*/
5181QScreenOrientationChangeEvent::QScreenOrientationChangeEvent(QScreen *screen, Qt::ScreenOrientation screenOrientation)
5182 : QEvent(QEvent::OrientationChange), m_screen(screen), m_orientation(screenOrientation)
5183{
5184}
5185
5186/*!
5187 Destroys QScreenOrientationChangeEvent.
5188*/
5189QScreenOrientationChangeEvent::~QScreenOrientationChangeEvent()
5190{
5191}
5192
5193/*!
5194 Returns the screen whose orientation changed.
5195*/
5196QScreen *QScreenOrientationChangeEvent::screen() const
5197{
5198 return m_screen;
5199}
5200
5201/*!
5202 Returns the orientation of the screen.
5203*/
5204Qt::ScreenOrientation QScreenOrientationChangeEvent::orientation() const
5205{
5206 return m_orientation;
5207}
5208
5209/*!
5210 Creates a new QApplicationStateChangeEvent.
5211 \a applicationState is the new state.
5212*/
5213QApplicationStateChangeEvent::QApplicationStateChangeEvent(Qt::ApplicationState applicationState)
5214 : QEvent(QEvent::ApplicationStateChange), m_applicationState(applicationState)
5215{
5216}
5217
5218/*!
5219 Returns the state of the application.
5220*/
5221Qt::ApplicationState QApplicationStateChangeEvent::applicationState() const
5222{
5223 return m_applicationState;
5224}
5225
5226/*!
5227 \class QPointingDeviceUniqueId
5228 \since 5.8
5229 \ingroup events
5230 \inmodule QtGui
5231
5232 \brief QPointingDeviceUniqueId identifies a unique object, such as a tagged token
5233 or stylus, which is used with a pointing device.
5234
5235 QPointingDeviceUniqueIds can be compared for equality, and can be used as keys in a QHash.
5236 You get access to the numerical ID via numericId(), if the device supports such IDs.
5237 For future extensions, though, you should not use that function, but compare objects
5238 of this type using the equality operator.
5239
5240 This class is a thin wrapper around an integer ID. You pass it into and out of
5241 functions by value.
5242
5243 This type actively prevents you from holding it in a QList, because doing so would
5244 be very inefficient. Use a QVector instead, which has the same API as QList, but more
5245 efficient storage.
5246
5247 \sa QTouchEvent::TouchPoint
5248*/
5249
5250/*!
5251 \fn QPointingDeviceUniqueId::QPointingDeviceUniqueId()
5252 Constructs an invalid unique pointer ID.
5253*/
5254
5255/*!
5256 Constructs a unique pointer ID from numeric ID \a id.
5257*/
5258QPointingDeviceUniqueId QPointingDeviceUniqueId::fromNumericId(qint64 id)
5259{
5260 QPointingDeviceUniqueId result;
5261 result.m_numericId = id;
5262 return result;
5263}
5264
5265/*!
5266 \fn bool QPointingDeviceUniqueId::isValid() const
5267
5268 Returns whether this unique pointer ID is valid, that is, it represents an actual
5269 pointer.
5270*/
5271
5272/*!
5273 \property QPointingDeviceUniqueId::numericId
5274 \brief the numeric unique ID of the token represented by a touchpoint
5275
5276 If the device provides a numeric ID, isValid() returns true, and this
5277 property provides the numeric ID;
5278 otherwise it is -1.
5279
5280 You should not use the value of this property in portable code, but
5281 instead rely on equality to identify pointers.
5282
5283 \sa isValid()
5284*/
5285qint64 QPointingDeviceUniqueId::numericId() const noexcept
5286{
5287 return m_numericId;
5288}
5289
5290/*!
5291 \relates QPointingDeviceUniqueId
5292 \since 5.8
5293
5294 Returns whether the two unique pointer IDs \a lhs and \a rhs identify the same pointer
5295 (\c true) or not (\c false).
5296*/
5297bool operator==(QPointingDeviceUniqueId lhs, QPointingDeviceUniqueId rhs) noexcept
5298{
5299 return lhs.numericId() == rhs.numericId();
5300}
5301
5302/*!
5303 \fn bool operator!=(QPointingDeviceUniqueId lhs, QPointingDeviceUniqueId rhs)
5304 \relates QPointingDeviceUniqueId
5305 \since 5.8
5306
5307 Returns whether the two unique pointer IDs \a lhs and \a rhs identify different pointers
5308 (\c true) or not (\c false).
5309*/
5310
5311/*!
5312 \relates QPointingDeviceUniqueId
5313 \since 5.8
5314
5315 Returns the hash value for \a key, using \a seed to seed the calculation.
5316*/
5317uint qHash(QPointingDeviceUniqueId key, uint seed) noexcept
5318{
5319 return qHash(key: key.numericId(), seed);
5320}
5321
5322QT_END_NAMESPACE
5323

source code of qtbase/src/gui/kernel/qevent.cpp