From df9d1414b836c93e97b4e12b90c4bf981b506467 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 16 Nov 2020 17:06:51 +0100 Subject: [PATCH] Don't cast QHoverEvent into QMouseEvent Such a cast rely on the fact that some internal data of both classes must match. Qt doesn't guarantee it. Change-Id: I5c29af98e320b72b599c059a2827eb2e7d3843da Reviewed-by: Miikka Heikkinen --- .../qml2puppet/editor3d/mousearea3d.cpp | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp index 1495bc4ea5d..1853363287f 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp @@ -838,6 +838,19 @@ QVector3D MouseArea3D::getMousePosInPlane(const MouseArea3D *helper, return sceneTrans.inverted().transform(intersectGlobalPos).toVec3(); } +static QPoint getPosFromMoveEvent(QEvent *event) +{ + switch (event->type()) { + case QEvent::MouseMove: + return static_cast(event)->pos(); + case QEvent::HoverMove: + return static_cast(event)->pos(); + default: + break; + } + return {}; +} + bool MouseArea3D::eventFilter(QObject *, QEvent *event) { if (!m_active || (m_grabsMouse && s_mouseGrab && s_mouseGrab != this @@ -951,10 +964,9 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event) } case QEvent::MouseMove: case QEvent::HoverMove: { - auto const mouseEvent = static_cast(event); - const QVector3D mousePosInPlane = getMousePosInPlane(m_dragging ? m_dragHelper : this, - mouseEvent->pos()); - const bool hasMouse = mouseOnTopOfMouseArea(mousePosInPlane, mouseEvent->pos()); + const QPoint pos = getPosFromMoveEvent(event); + const QVector3D mousePosInPlane = getMousePosInPlane(m_dragging ? m_dragHelper : this, pos); + const bool hasMouse = mouseOnTopOfMouseArea(mousePosInPlane, pos); setHovering(hasMouse); @@ -970,7 +982,7 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event) if (m_dragging && (m_circlePickArea.y() > 0. || !qFuzzyCompare(mousePosInPlane.z(), -1))) { m_mousePosInPlane = mousePosInPlane; - emit dragged(mousePosInPlane.toVector2D(), mouseEvent->pos()); + emit dragged(mousePosInPlane.toVector2D(), pos); } break;