Coverage Report

Created: 2025-09-08 07:52

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