diff options
Diffstat (limited to 'src/widgets/widgets/qmenubar.cpp')
-rw-r--r-- | src/widgets/widgets/qmenubar.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/widgets/widgets/qmenubar.cpp b/src/widgets/widgets/qmenubar.cpp index 1ffe82835d..c9c9191c17 100644 --- a/src/widgets/widgets/qmenubar.cpp +++ b/src/widgets/widgets/qmenubar.cpp @@ -286,16 +286,23 @@ void QMenuBarPrivate::popupAction(QAction *action, bool activateFirst) activeMenuPriv->causedPopup.action = action; QRect adjustedActionRect = actionRect(action); - QPoint pos(q->mapToGlobal(QPoint(adjustedActionRect.left(), adjustedActionRect.bottom() + 1))); + QPoint popupPos = adjustedActionRect.bottomLeft() + QPoint(0, 1); + //we put the popup menu on the screen containing the bottom-center of the action rect QScreen *menubarScreen = q->window()->windowHandle()->screen(); - QPointer<QScreen> popupScreen = menubarScreen->virtualSiblingAt(pos + QPoint(adjustedActionRect.width() / 2, 0)); + QPoint screenTestPos = q->mapToGlobal(popupPos + QPoint(adjustedActionRect.width() / 2, 0)); + QPointer<QScreen> popupScreen = menubarScreen->virtualSiblingAt(screenTestPos); if (!popupScreen) popupScreen = menubarScreen; std::swap(popupScreen, activeMenuPriv->popupScreen); const QSize popup_size = activeMenu->sizeHint(); std::swap(popupScreen, activeMenuPriv->popupScreen); + // Use screenTestPos.y() for the popup y position. This is the correct global y + // consistent with the selected screen in cases where the action rect spans + // multiple screens with different scale factors. + QPoint pos(q->mapToGlobal(popupPos).x(), screenTestPos.y()); + QRect screenRect = popupScreen->geometry(); pos = QPoint(qMax(pos.x(), screenRect.x()), qMax(pos.y(), screenRect.y())); const bool fitUp = (pos.y() - popup_size.height() >= screenRect.top()); |