diff options
author | Mike Krus <mike.krus@kdab.com> | 2020-11-23 11:20:41 +0000 |
---|---|---|
committer | Mike Krus <mike.krus@kdab.com> | 2020-11-24 18:50:12 +0000 |
commit | c9ddee20bc6f82b171cc9346d7afa3562b7e41ca (patch) | |
tree | ffeb27b52418050cbc2df0d780c7828ff99923ff /src | |
parent | 9c2f818c270f0edad5d9d6ea7c027e033ab39a64 (diff) |
Handle fallout from QEvent loosing it's copy constructor
Task-number: QTBUG-88757
Change-Id: I5097faecd2e895d4685a4cc57a4e2a5c079f2255
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
(cherry picked from commit d826238b65b0ebd8034900224b382bd85e6add27)
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/animation/frontend/qanimationclipdata.h | 1 | ||||
-rw-r--r-- | src/input/frontend/qkeyevent.cpp | 8 | ||||
-rw-r--r-- | src/input/frontend/qkeyevent.h | 22 | ||||
-rw-r--r-- | src/input/frontend/qmouseevent.cpp | 26 | ||||
-rw-r--r-- | src/input/frontend/qmouseevent.h | 33 | ||||
-rw-r--r-- | src/plugins/renderers/opengl/renderer/renderer.cpp | 6 | ||||
-rw-r--r-- | src/plugins/renderers/opengl/renderer/renderer_p.h | 2 | ||||
-rw-r--r-- | src/render/jobs/pickboundingvolumejob.cpp | 10 | ||||
-rw-r--r-- | src/render/jobs/pickboundingvolumejob_p.h | 3 | ||||
-rw-r--r-- | src/render/picking/pickeventfilter.cpp | 22 | ||||
-rw-r--r-- | src/render/picking/pickeventfilter_p.h | 5 |
11 files changed, 59 insertions, 79 deletions
diff --git a/src/animation/frontend/qanimationclipdata.h b/src/animation/frontend/qanimationclipdata.h index 07c7d92c2..bcb0fcda1 100644 --- a/src/animation/frontend/qanimationclipdata.h +++ b/src/animation/frontend/qanimationclipdata.h @@ -40,6 +40,7 @@ #ifndef QT3DANIMATION_QANIMATIONCLIPDATA_H #define QT3DANIMATION_QANIMATIONCLIPDATA_H +#include <QtCore/qmetatype.h> #include <QtCore/qscopedpointer.h> #include <QtCore/qstring.h> #include <Qt3DAnimation/qt3danimation_global.h> diff --git a/src/input/frontend/qkeyevent.cpp b/src/input/frontend/qkeyevent.cpp index efbddc771..07319ea53 100644 --- a/src/input/frontend/qkeyevent.cpp +++ b/src/input/frontend/qkeyevent.cpp @@ -74,16 +74,16 @@ namespace Qt3DInput { QKeyEvent::QKeyEvent(QEvent::Type type, int key, Qt::KeyboardModifiers modifiers, const QString &text, bool autorep, ushort count) : QObject() - , m_event(type, key, modifiers, text, autorep, count) + , m_event(new QT_PREPEND_NAMESPACE(QKeyEvent){type, key, modifiers, text, autorep, count}) { - m_event.setAccepted(false); + m_event->setAccepted(false); } QKeyEvent::QKeyEvent(const QT_PREPEND_NAMESPACE(QKeyEvent) &ke) : QObject() - , m_event(ke) + , m_event(static_cast<QT_PREPEND_NAMESPACE(QKeyEvent) *>(ke.clone())) { - m_event.setAccepted(false); + m_event->setAccepted(false); } /*! \internal */ diff --git a/src/input/frontend/qkeyevent.h b/src/input/frontend/qkeyevent.h index c1e221aae..52be3b213 100644 --- a/src/input/frontend/qkeyevent.h +++ b/src/input/frontend/qkeyevent.h @@ -69,21 +69,21 @@ public: explicit QKeyEvent(const QT_PREPEND_NAMESPACE(QKeyEvent) &ke); ~QKeyEvent(); - inline int key() const { return m_event.key(); } - inline QString text() const { return m_event.text(); } - inline int modifiers() const { return m_event.modifiers(); } - inline bool isAutoRepeat() const { return m_event.isAutoRepeat(); } - inline int count() const { return m_event.count(); } - inline quint32 nativeScanCode() const { return m_event.nativeScanCode(); } - inline bool isAccepted() const { return m_event.isAccepted(); } - inline void setAccepted(bool accepted) { m_event.setAccepted(accepted); } - inline QEvent::Type type() const { return m_event.type(); } + inline int key() const { return m_event->key(); } + inline QString text() const { return m_event->text(); } + inline int modifiers() const { return m_event->modifiers(); } + inline bool isAutoRepeat() const { return m_event->isAutoRepeat(); } + inline int count() const { return m_event->count(); } + inline quint32 nativeScanCode() const { return m_event->nativeScanCode(); } + inline bool isAccepted() const { return m_event->isAccepted(); } + inline void setAccepted(bool accepted) { m_event->setAccepted(accepted); } + inline QEvent::Type type() const { return m_event->type(); } #if QT_CONFIG(shortcut) - Q_INVOKABLE bool matches(QKeySequence::StandardKey key_) const { return m_event.matches(key_); } + Q_INVOKABLE bool matches(QKeySequence::StandardKey key_) const { return m_event->matches(key_); } #endif private: - QT_PREPEND_NAMESPACE(QKeyEvent) m_event; + std::unique_ptr<QT_PREPEND_NAMESPACE(QKeyEvent)> m_event; }; } // namespace Qt3DInput diff --git a/src/input/frontend/qmouseevent.cpp b/src/input/frontend/qmouseevent.cpp index 2b06c824d..d73724360 100644 --- a/src/input/frontend/qmouseevent.cpp +++ b/src/input/frontend/qmouseevent.cpp @@ -46,9 +46,9 @@ namespace Qt3DInput { namespace { template<typename EventClass, typename QtEventClass> -typename EventClass::Modifiers modifiersForEvent(const QtEventClass &event) +typename EventClass::Modifiers modifiersForEvent(const QtEventClass *event) { - const Qt::KeyboardModifiers eventModifiers = event.modifiers(); + const Qt::KeyboardModifiers eventModifiers = event->modifiers(); int modifiers = EventClass::NoModifier; if (eventModifiers & Qt::ShiftModifier) @@ -259,7 +259,11 @@ typename EventClass::Modifiers modifiersForEvent(const QtEventClass &event) */ QMouseEvent::QMouseEvent(const QT_PREPEND_NAMESPACE(QMouseEvent) &e) : QObject() - , m_event(e) +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + , m_event(static_cast<QT_PREPEND_NAMESPACE(QMouseEvent)*>(e.clone())) +#else + , m_even(new QT_PREPEND_NAMESPACE(QMouseEvent)(e)) +#endif { } @@ -272,7 +276,7 @@ QMouseEvent::~QMouseEvent() */ QMouseEvent::Buttons QMouseEvent::button() const { - switch (m_event.button()) { + switch (m_event->button()) { case Qt::LeftButton: return QMouseEvent::LeftButton; case Qt::RightButton: @@ -292,7 +296,7 @@ QMouseEvent::Buttons QMouseEvent::button() const */ int QMouseEvent::buttons() const { - return m_event.buttons(); + return m_event->buttons(); } /*! @@ -300,7 +304,7 @@ int QMouseEvent::buttons() const */ QMouseEvent::Modifiers QMouseEvent::modifiers() const { - return modifiersForEvent<QMouseEvent, decltype(m_event)>(m_event); + return modifiersForEvent<QMouseEvent, QT_PREPEND_NAMESPACE(QMouseEvent)>(m_event.get()); } /*! @@ -478,7 +482,11 @@ QMouseEvent::Modifiers QMouseEvent::modifiers() const */ QWheelEvent::QWheelEvent(const QT_PREPEND_NAMESPACE(QWheelEvent) &e) : QObject() - , m_event(e) +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + , m_event(static_cast<QT_PREPEND_NAMESPACE(QWheelEvent)*>(e.clone())) +#else + , m_even(new QT_PREPEND_NAMESPACE(QMouseEvent)(e)) +#endif { } @@ -492,7 +500,7 @@ QWheelEvent::~QWheelEvent() */ int QWheelEvent::buttons() const { - return m_event.buttons(); + return m_event->buttons(); } /*! @@ -500,7 +508,7 @@ int QWheelEvent::buttons() const */ QWheelEvent::Modifiers QWheelEvent::modifiers() const { - return modifiersForEvent<QWheelEvent, decltype(m_event)>(m_event); + return modifiersForEvent<QWheelEvent, QT_PREPEND_NAMESPACE(QWheelEvent)>(m_event.get()); } #endif // QT_CONFIG(wheelevent) diff --git a/src/input/frontend/qmouseevent.h b/src/input/frontend/qmouseevent.h index a663c2e44..809c71ec5 100644 --- a/src/input/frontend/qmouseevent.h +++ b/src/input/frontend/qmouseevent.h @@ -45,6 +45,8 @@ #include <QtCore/QObject> #include <QtGui/QMouseEvent> +#include <memory> + QT_BEGIN_NAMESPACE namespace Qt3DInput { @@ -59,7 +61,6 @@ class Q_3DINPUTSHARED_EXPORT QMouseEvent : public QObject Q_PROPERTY(int buttons READ buttons CONSTANT) Q_PROPERTY(Qt3DInput::QMouseEvent::Modifiers modifiers READ modifiers CONSTANT) Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted) - public: enum Buttons { LeftButton = Qt::LeftButton, @@ -84,25 +85,25 @@ public: explicit QMouseEvent(const QT_PREPEND_NAMESPACE(QMouseEvent) &e); ~QMouseEvent(); - inline int x() const { return int(m_event.position().x()); } - inline int y() const { return int(m_event.position().y()); } + inline int x() const { return int(m_event->position().x()); } + inline int y() const { return int(m_event->position().y()); } inline bool wasHeld() const { #if QT_CONFIG(gestures) - return static_cast<Qt::GestureType>(m_event.type()) == Qt::TapAndHoldGesture; + return static_cast<Qt::GestureType>(m_event->type()) == Qt::TapAndHoldGesture; #else - return false; + return false; #endif } Buttons button() const; int buttons() const; Modifiers modifiers() const; - inline bool isAccepted() const { return m_event.isAccepted(); } - inline void setAccepted(bool accepted) { m_event.setAccepted(accepted); } - inline QEvent::Type type() const { return m_event.type(); } + inline bool isAccepted() const { return m_event->isAccepted(); } + inline void setAccepted(bool accepted) { m_event->setAccepted(accepted); } + inline QEvent::Type type() const { return m_event->type(); } private: - QT_PREPEND_NAMESPACE(QMouseEvent) m_event; + std::unique_ptr<QT_PREPEND_NAMESPACE(QMouseEvent)> m_event; }; typedef QSharedPointer<QMouseEvent> QMouseEventPtr; @@ -142,18 +143,18 @@ public: explicit QWheelEvent(const QT_PREPEND_NAMESPACE(QWheelEvent) &e); ~QWheelEvent(); - inline int x() const { return int(m_event.position().x()); } - inline int y() const { return int(m_event.position().y()); } - inline QPoint angleDelta() const { return m_event.angleDelta(); } + inline int x() const { return int(m_event->position().x()); } + inline int y() const { return int(m_event->position().y()); } + inline QPoint angleDelta() const { return m_event->angleDelta(); } int buttons() const; Modifiers modifiers() const; - inline bool isAccepted() const { return m_event.isAccepted(); } - inline void setAccepted(bool accepted) { m_event.setAccepted(accepted); } - inline QEvent::Type type() const { return m_event.type(); } + inline bool isAccepted() const { return m_event->isAccepted(); } + inline void setAccepted(bool accepted) { m_event->setAccepted(accepted); } + inline QEvent::Type type() const { return m_event->type(); } private: - QT_PREPEND_NAMESPACE(QWheelEvent) m_event; + std::unique_ptr<QT_PREPEND_NAMESPACE(QWheelEvent)> m_event; }; typedef QSharedPointer<QWheelEvent> QWheelEventPtr; diff --git a/src/plugins/renderers/opengl/renderer/renderer.cpp b/src/plugins/renderers/opengl/renderer/renderer.cpp index 26b2b0ed8..91bf77fa9 100644 --- a/src/plugins/renderers/opengl/renderer/renderer.cpp +++ b/src/plugins/renderers/opengl/renderer/renderer.cpp @@ -1639,12 +1639,6 @@ Renderer::ViewSubmissionResultData Renderer::submitRenderViews(const std::vector m_imGuiRenderer->setCapabilities(m_settings->capabilities()); } - { - for (auto &keyEvent: m_frameKeyEvents) - m_imGuiRenderer->processEvent(&keyEvent); - for (auto &mouseEvent: m_frameMouseEvents) - m_imGuiRenderer->processEvent(&mouseEvent.second); - } m_imGuiRenderer->renderDebugOverlay(renderViews, renderView, m_jobsInLastFrame); } #endif diff --git a/src/plugins/renderers/opengl/renderer/renderer_p.h b/src/plugins/renderers/opengl/renderer/renderer_p.h index 4e4b7a28a..aedd49b49 100644 --- a/src/plugins/renderers/opengl/renderer/renderer_p.h +++ b/src/plugins/renderers/opengl/renderer/renderer_p.h @@ -419,8 +419,6 @@ private: QSharedPointer<ResourceAccessor> m_scene2DResourceAccessor; Debug::ImGuiRenderer *m_imGuiRenderer; - QList<QPair<QObject *, QMouseEvent>> m_frameMouseEvents; - QList<QKeyEvent> m_frameKeyEvents; int m_jobsInLastFrame; }; diff --git a/src/render/jobs/pickboundingvolumejob.cpp b/src/render/jobs/pickboundingvolumejob.cpp index e0f4c8bf0..2420ce439 100644 --- a/src/render/jobs/pickboundingvolumejob.cpp +++ b/src/render/jobs/pickboundingvolumejob.cpp @@ -211,7 +211,11 @@ void PickBoundingVolumeJob::setRoot(Entity *root) bool PickBoundingVolumeJob::processMouseEvent(QObject* object, QMouseEvent *event) { - m_pendingMouseEvents.emplace_back(object, QMouseEvent(*event)); +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + m_pendingMouseEvents.emplace_back(object, std::unique_ptr<QMouseEvent>(static_cast<QMouseEvent *>(event->clone()))); +#else + m_pendingMouseEvents.emplace_back(object, new QMouseEvent(*event)); +#endif return false; } @@ -254,7 +258,7 @@ bool PickBoundingVolumeJob::runHelper() bool hasOtherEvent = false; // Quickly look which types of events we've got for (const auto &event : mouseEvents) { - const bool isMove = (event.second.type() == QEvent::MouseMove); + const bool isMove = (event.second->type() == QEvent::MouseMove); hasMoveEvent |= isMove; hasOtherEvent |= !isMove; } @@ -290,7 +294,7 @@ bool PickBoundingVolumeJob::runHelper() // For each mouse event for (const auto &event : mouseEvents) - processPickEvent(pickConfiguration, event.first, &event.second); + processPickEvent(pickConfiguration, event.first, event.second.get()); // Clear Hovered elements that needs to be cleared // Send exit event to object pickers on which we diff --git a/src/render/jobs/pickboundingvolumejob_p.h b/src/render/jobs/pickboundingvolumejob_p.h index daf66583f..f95d4f773 100644 --- a/src/render/jobs/pickboundingvolumejob_p.h +++ b/src/render/jobs/pickboundingvolumejob_p.h @@ -65,6 +65,7 @@ #include <QSharedPointer> #include <vector> +#include <memory> QT_BEGIN_NAMESPACE @@ -109,7 +110,7 @@ private: void clearPreviouslyHoveredPickers(); - std::vector<std::pair<QObject*, QMouseEvent>> m_pendingMouseEvents; + std::vector<std::pair<QObject*, std::unique_ptr<QMouseEvent>>> m_pendingMouseEvents; bool m_pickersDirty; bool m_oneHoverAtLeast; HObjectPicker m_currentPicker; diff --git a/src/render/picking/pickeventfilter.cpp b/src/render/picking/pickeventfilter.cpp index 42e26dbae..998829b34 100644 --- a/src/render/picking/pickeventfilter.cpp +++ b/src/render/picking/pickeventfilter.cpp @@ -60,25 +60,6 @@ PickEventFilter::~PickEventFilter() /*! \internal - Called from a worker thread in the thread pool so be sure to - mutex protect the data. -*/ -QList<QPair<QObject *, QMouseEvent> > PickEventFilter::pendingMouseEvents() -{ - QList<QPair<QObject*, QMouseEvent>> pendingEvents(m_pendingMouseEvents); - m_pendingMouseEvents.clear(); - return pendingEvents; -} - -QList<QKeyEvent> PickEventFilter::pendingKeyEvents() -{ - QList<QKeyEvent> pendingEvents(m_pendingKeyEvents); - m_pendingKeyEvents.clear(); - return pendingEvents; -} - -/*! - \internal Called from the main thread. */ bool PickEventFilter::eventFilter(QObject *obj, QEvent *e) @@ -87,19 +68,16 @@ bool PickEventFilter::eventFilter(QObject *obj, QEvent *e) case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: case QEvent::MouseMove: - m_pendingMouseEvents.push_back({obj, QMouseEvent(*static_cast<QMouseEvent *>(e))}); return m_aspect->processMouseEvent(obj, static_cast<QMouseEvent *>(e)); case QEvent::HoverMove: { QHoverEvent *he = static_cast<QHoverEvent *>(e); auto mouseEvent = QMouseEvent(QEvent::MouseMove, he->position(), Qt::NoButton, Qt::NoButton, he->modifiers()); - m_pendingMouseEvents.push_back({obj, mouseEvent}); return m_aspect->processMouseEvent(obj, &mouseEvent); } case QEvent::KeyPress: case QEvent::KeyRelease: - m_pendingKeyEvents.push_back(QKeyEvent(*static_cast<QKeyEvent *>(e))); return m_aspect->processKeyEvent(obj, static_cast<QKeyEvent *>(e)); default: break; diff --git a/src/render/picking/pickeventfilter_p.h b/src/render/picking/pickeventfilter_p.h index 85fcf454a..67752458b 100644 --- a/src/render/picking/pickeventfilter_p.h +++ b/src/render/picking/pickeventfilter_p.h @@ -72,16 +72,11 @@ public: explicit PickEventFilter(QRenderAspectPrivate *aspect, QObject *parent = nullptr); ~PickEventFilter(); - QList<QPair<QObject*, QMouseEvent>> pendingMouseEvents(); - QList<QKeyEvent> pendingKeyEvents(); - protected: bool eventFilter(QObject *obj, QEvent *e) final; private: QRenderAspectPrivate *m_aspect; - QList<QPair<QObject*, QMouseEvent>> m_pendingMouseEvents; - QList<QKeyEvent> m_pendingKeyEvents; }; } // Render |