summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/kernel/qcoreevent.cpp1
-rw-r--r--src/corelib/kernel/qcoreevent.h1
-rw-r--r--src/widgets/graphicsview/qgraphicsscene.cpp10
-rw-r--r--src/widgets/graphicsview/qgraphicsview.cpp9
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)