diff --git a/src/corelib/kernel/qcoreevent.cpp b/src/corelib/kernel/qcoreevent.cpp index 34712be47a..418f40495c 100644 --- a/src/corelib/kernel/qcoreevent.cpp +++ b/src/corelib/kernel/qcoreevent.cpp @@ -295,7 +295,7 @@ QT_BEGIN_NAMESPACE Contructs an event object of type \a type. */ QEvent::QEvent(Type type) - : d(nullptr), t(type), posted(false), spont(false), m_accept(true), m_inputEvent(false) + : d(nullptr), t(type), posted(false), spont(false), m_accept(true), m_inputEvent(false), m_pointerEvent(false) { Q_TRACE(QEvent_ctor, this, t); } @@ -322,7 +322,16 @@ QEvent::QEvent(const QEvent &other) \since 6.0 \fn QEvent::QEvent(Type type, QEvent::InputEventTag) - Constructs an event object of type \a type, setting the inputEvent flag to true. + Constructs an event object of type \a type, setting the inputEvent flag to \c true. +*/ + +/*! + \internal + \since 6.0 + \fn QEvent::QEvent(Type type, QEvent::PointerEventTag) + + Constructs an event object of type \a type, setting the pointerEvent and + inputEvent flags to \c true. */ /*! @@ -423,6 +432,14 @@ QEvent::~QEvent() subclasses. */ +/*! + \fn bool QEvent::isPointerEvent() const + \since 6.0 + + Returns \c true if the event object is a QPointerEvent or one of its + subclasses. +*/ + namespace { template struct QBasicAtomicBitField { diff --git a/src/corelib/kernel/qcoreevent.h b/src/corelib/kernel/qcoreevent.h index 209ed25d6b..2ae42a3c01 100644 --- a/src/corelib/kernel/qcoreevent.h +++ b/src/corelib/kernel/qcoreevent.h @@ -308,12 +308,15 @@ public: inline void ignore() { m_accept = false; } inline bool isInputEvent() const noexcept { return m_inputEvent; } + inline bool isPointerEvent() const noexcept { return m_pointerEvent; } static int registerEventType(int hint = -1) noexcept; protected: struct InputEventTag { explicit InputEventTag() = default; }; QEvent(Type type, InputEventTag) : QEvent(type) { m_inputEvent = true; } + struct PointerEventTag { explicit PointerEventTag() = default; }; + QEvent(Type type, PointerEventTag) : QEvent(type, InputEventTag{}) { m_pointerEvent = true; } QEventPrivate *d; ushort t; @@ -322,7 +325,8 @@ private: ushort spont : 1; ushort m_accept : 1; ushort m_inputEvent : 1; - ushort reserved : 12; + ushort m_pointerEvent : 1; + ushort reserved : 11; friend class QCoreApplication; friend class QCoreApplicationPrivate; diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp index 2414a0d951..ab60a74e1b 100644 --- a/src/gui/kernel/qevent.cpp +++ b/src/gui/kernel/qevent.cpp @@ -164,6 +164,13 @@ QInputEvent::QInputEvent(Type type, const QInputDevice *dev, Qt::KeyboardModifie : QEvent(type, QEvent::InputEventTag{}), m_dev(dev), m_modState(modifiers) {} +/*! + \internal +*/ +QInputEvent::QInputEvent(QEvent::Type type, QEvent::PointerEventTag, const QInputDevice *dev, Qt::KeyboardModifiers modifiers) + : QEvent(type, QEvent::PointerEventTag{}), m_dev(dev), m_modState(modifiers) +{} + /*! \internal */ @@ -345,7 +352,7 @@ QPointF QEventPoint::lastNormalizedPos() const } QPointerEvent::QPointerEvent(QEvent::Type type, const QPointingDevice *dev, Qt::KeyboardModifiers modifiers) - : QInputEvent(type, dev, modifiers) + : QInputEvent(type, QEvent::PointerEventTag{}, dev, modifiers) { } diff --git a/src/gui/kernel/qevent.h b/src/gui/kernel/qevent.h index 86878bfb67..210f6f1571 100644 --- a/src/gui/kernel/qevent.h +++ b/src/gui/kernel/qevent.h @@ -82,6 +82,8 @@ public: inline void setTimestamp(ulong timestamp) { m_timeStamp = timestamp; } protected: + QInputEvent(Type type, PointerEventTag, const QInputDevice *m_dev, Qt::KeyboardModifiers modifiers = Qt::NoModifier); + const QInputDevice *m_dev = nullptr; Qt::KeyboardModifiers m_modState = Qt::NoModifier; ulong m_timeStamp = 0; diff --git a/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp b/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp index da649c4400..258ea0c85d 100644 --- a/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp +++ b/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp @@ -115,6 +115,8 @@ void tst_QMouseEvent::mouseEventBasic() QPointF screen(300, 300); // Press left button QMouseEvent me(QEvent::MouseButtonPress, local, scene, screen, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + QVERIFY(me.isInputEvent()); + QVERIFY(me.isPointerEvent()); QCOMPARE(me.isAccepted(), true); QCOMPARE(me.button(), Qt::LeftButton); QCOMPARE(me.buttons(), Qt::LeftButton); diff --git a/tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp b/tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp index 0b5de83018..332d04ecd4 100644 --- a/tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp +++ b/tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp @@ -302,6 +302,8 @@ void tst_QTouchEvent::state() QVERIFY(touchEvent.isPressEvent()); QVERIFY(!touchEvent.isUpdateEvent()); QVERIFY(!touchEvent.isReleaseEvent()); + QVERIFY(touchEvent.isInputEvent()); + QVERIFY(touchEvent.isPointerEvent()); touchEvent = QTouchEvent(QEvent::TouchBegin, touchScreenDevice, Qt::NoModifier, QList() <<