diff options
Diffstat (limited to 'src/widgets/kernel/qwidgetwindow.cpp')
-rw-r--r-- | src/widgets/kernel/qwidgetwindow.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp index 900818d5c6..b49441beba 100644 --- a/src/widgets/kernel/qwidgetwindow.cpp +++ b/src/widgets/kernel/qwidgetwindow.cpp @@ -234,14 +234,20 @@ void QWidgetWindow::handleEnterLeaveEvent(QEvent *event) while (enterParent->parent()) enterParent = enterParent->parent(); if (thisParent == enterParent) { + QGuiApplicationPrivate::currentMouseWindow = enterWindow; enter = enterWindow->widget(); QWindowSystemInterfacePrivate::removeWindowSystemEvent(systemEvent); } } } - QWidget *leave = qt_last_mouse_receiver ? qt_last_mouse_receiver.data() : m_widget; - QApplicationPrivate::dispatchEnterLeave(enter, leave); - qt_last_mouse_receiver = enter; + // Enter-leave between sibling widgets is ignored when there is a mousegrabber - this makes + // both native and non-native widgets work similarly. + // When mousegrabbing, leaves are only generated if leaving the parent window. + if (!enter || !QWidget::mouseGrabber()) { + QWidget *leave = qt_last_mouse_receiver ? qt_last_mouse_receiver.data() : m_widget; + QApplicationPrivate::dispatchEnterLeave(enter, leave); + qt_last_mouse_receiver = enter; + } } else { QApplicationPrivate::dispatchEnterLeave(m_widget, 0); qt_last_mouse_receiver = m_widget; |