diff options
-rw-r--r-- | src/corelib/kernel/qcoreevent.cpp | 1 | ||||
-rw-r--r-- | src/corelib/kernel/qcoreevent.h | 1 | ||||
-rw-r--r-- | src/widgets/graphicsview/qgraphicsscene.cpp | 10 | ||||
-rw-r--r-- | src/widgets/graphicsview/qgraphicsview.cpp | 9 |
4 files changed, 14 insertions, 7 deletions
diff --git a/src/corelib/kernel/qcoreevent.cpp b/src/corelib/kernel/qcoreevent.cpp index ceb1a35775..de526d6085 100644 --- a/src/corelib/kernel/qcoreevent.cpp +++ b/src/corelib/kernel/qcoreevent.cpp @@ -153,6 +153,7 @@ QT_BEGIN_NAMESPACE \value GraphicsSceneMove Widget was moved (QGraphicsSceneMoveEvent). \value GraphicsSceneResize Widget was resized (QGraphicsSceneResizeEvent). \value GraphicsSceneWheel Mouse wheel rolled in a graphics scene (QGraphicsSceneWheelEvent). + \value GraphicsSceneLeave The cursor leaves a graphics scene (QGraphicsSceneWheelEvent). \value Hide Widget was hidden (QHideEvent). \value HideToParent A child widget has been hidden. \value HoverEnter The mouse cursor enters a hover widget (QHoverEvent). diff --git a/src/corelib/kernel/qcoreevent.h b/src/corelib/kernel/qcoreevent.h index 4beb064d92..dbca4adaab 100644 --- a/src/corelib/kernel/qcoreevent.h +++ b/src/corelib/kernel/qcoreevent.h @@ -205,6 +205,7 @@ public: GraphicsSceneDragLeave = 166, GraphicsSceneDrop = 167, GraphicsSceneWheel = 168, + GraphicsSceneLeave = 220, KeyboardLayoutChange = 169, // keyboard layout changed diff --git a/src/widgets/graphicsview/qgraphicsscene.cpp b/src/widgets/graphicsview/qgraphicsscene.cpp index 2f3cb4eaaf..2e65effb1a 100644 --- a/src/widgets/graphicsview/qgraphicsscene.cpp +++ b/src/widgets/graphicsview/qgraphicsscene.cpp @@ -3371,9 +3371,15 @@ bool QGraphicsScene::event(QEvent *event) break; } case QEvent::Leave: - // hackieshly unpacking the viewport pointer from the leave event. - d->leaveScene(reinterpret_cast<QWidget *>(event->d)); + Q_ASSERT_X(false, "QGraphicsScene::event", + "QGraphicsScene must not receive QEvent::Leave, use GraphicsSceneLeave"); break; + case QEvent::GraphicsSceneLeave: + { + auto *leaveEvent = static_cast<QGraphicsSceneEvent*>(event); + d->leaveScene(leaveEvent->widget()); + break; + } case QEvent::GraphicsSceneHelp: helpEvent(static_cast<QGraphicsSceneHelpEvent *>(event)); break; diff --git a/src/widgets/graphicsview/qgraphicsview.cpp b/src/widgets/graphicsview/qgraphicsview.cpp index 1db7bf222d..74a7755ccf 100644 --- a/src/widgets/graphicsview/qgraphicsview.cpp +++ b/src/widgets/graphicsview/qgraphicsview.cpp @@ -2871,11 +2871,10 @@ bool QGraphicsView::viewportEvent(QEvent *event) d->scene->d_func()->removePopup(d->scene->d_func()->popupWidgets.constFirst()); } d->useLastMouseEvent = false; - // a hack to pass a viewport pointer to the scene inside the leave event - Q_ASSERT(event->d == nullptr); - QScopedValueRollback<QEventPrivate *> rb(event->d); - event->d = reinterpret_cast<QEventPrivate *>(viewport()); - QCoreApplication::sendEvent(d->scene, event); + QGraphicsSceneEvent leaveEvent(QEvent::GraphicsSceneLeave); + leaveEvent.setWidget(viewport()); + QCoreApplication::sendEvent(d->scene, &leaveEvent); + event->setAccepted(leaveEvent.isAccepted()); break; } #if QT_CONFIG(tooltip) |