From 9aba868571e7448ea79229a31d18bfd3e69813f8 Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Tue, 20 Oct 2020 22:39:18 +0200 Subject: QEvent copy constructor: copy the type flags too Failure to copy m_inputEvent and m_pointerEvent actually left them uninitialized, and resulted in random behavior in Qt Quick when Flickable clones a pointer event for later replay. Remove the comment about copying events being a "bad idea" in Qt 4, while we're at it. Copying became more common in Qt 5, and we probably won't be able to stop doing it now. Change-Id: I40b6ba5ad696e7aaafbeefbca86eca00cab40616 Reviewed-by: Thiago Macieira --- src/corelib/kernel/qcoreevent.cpp | 9 +++------ tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp | 9 +++++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/corelib/kernel/qcoreevent.cpp b/src/corelib/kernel/qcoreevent.cpp index 53ef8eeb50..fbea252bc0 100644 --- a/src/corelib/kernel/qcoreevent.cpp +++ b/src/corelib/kernel/qcoreevent.cpp @@ -301,14 +301,11 @@ QEvent::QEvent(Type type) /*! \internal - Attempts to copy the \a other event. - - Copying events is a bad idea, yet some Qt 4 code does it (notably, - QApplication and the state machine). - */ + Copies the \a other event. +*/ QEvent::QEvent(const QEvent &other) : d(other.d), t(other.t), posted(other.posted), spont(other.spont), - m_accept(other.m_accept) + m_accept(other.m_accept), m_inputEvent(other.m_inputEvent), m_pointerEvent(other.m_pointerEvent) { Q_TRACE(QEvent_ctor, this, t); // if QEventPrivate becomes available, make sure to implement a diff --git a/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp b/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp index c5bc7a9460..42a5f4d593 100644 --- a/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp +++ b/tests/auto/gui/kernel/qmouseevent/tst_qmouseevent.cpp @@ -179,6 +179,15 @@ void tst_QMouseEvent::mouseEventBasic() me = QMouseEvent(QEvent::MouseButtonRelease, local, scene, screen, Qt::LeftButton, Qt::NoButton, Qt::NoModifier); QVERIFY(!me.isBeginEvent()); QVERIFY(me.isEndEvent()); + // Try out the copy constructor + QMouseEvent copy(me); + QVERIFY(copy.isInputEvent()); + QVERIFY(copy.isPointerEvent()); + QVERIFY(!copy.isBeginEvent()); + QVERIFY(copy.isEndEvent()); + QCOMPARE(copy.position(), local); + QCOMPARE(copy.scenePosition(), scene); + QCOMPARE(copy.globalPosition(), screen); } void tst_QMouseEvent::checkMousePressEvent_data() -- cgit v1.2.3