summaryrefslogtreecommitdiffstats
path: root/src/widgets/kernel/qwidgetwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets/kernel/qwidgetwindow.cpp')
-rw-r--r--src/widgets/kernel/qwidgetwindow.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp
index b2a2ecc3b9..15c28d0913 100644
--- a/src/widgets/kernel/qwidgetwindow.cpp
+++ b/src/widgets/kernel/qwidgetwindow.cpp
@@ -747,13 +747,24 @@ void QWidgetWindow::handleWheelEvent(QWheelEvent *event)
if (QApplicationPrivate::instance()->modalState() && !qt_try_modal(m_widget, event->type()))
return;
+ QWidget *rootWidget = m_widget;
+ QPoint pos = event->pos();
+
+ // Use proper popup window for wheel event. Some QPA sends the wheel
+ // event to the root menu, so redirect it to the proper popup window.
+ QWidget *activePopupWidget = QApplication::activePopupWidget();
+ if (activePopupWidget && activePopupWidget != m_widget) {
+ rootWidget = activePopupWidget;
+ pos = rootWidget->mapFromGlobal(event->globalPos());
+ }
+
// which child should have it?
- QWidget *widget = m_widget->childAt(event->pos());
+ QWidget *widget = rootWidget->childAt(pos);
if (!widget)
- widget = m_widget;
+ widget = rootWidget;
- QPoint mapped = widget->mapFrom(m_widget, event->pos());
+ QPoint mapped = widget->mapFrom(rootWidget, pos);
QWheelEvent translated(mapped, event->globalPos(), event->pixelDelta(), event->angleDelta(), event->delta(), event->orientation(), event->buttons(), event->modifiers(), event->phase(), event->source());
QGuiApplication::sendSpontaneousEvent(widget, &translated);