diff options
Diffstat (limited to 'src/widgets/widgets')
-rw-r--r-- | src/widgets/widgets/qmenu.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp index d60a484094..6e6825daea 100644 --- a/src/widgets/widgets/qmenu.cpp +++ b/src/widgets/widgets/qmenu.cpp @@ -40,6 +40,7 @@ #include "qmenu.h" #include <QtWidgets/private/qtwidgetsglobal_p.h> +#include <QtWidgets/private/qwidgetwindow_p.h> #include "qdebug.h" #include "qstyle.h" @@ -791,6 +792,8 @@ void QMenuSloppyState::setSubMenuPopup(const QRect &actionRect, QAction *resetAc m_use_reset_action = true; m_time.stop(); m_action_rect = actionRect; + if (m_sub_menu) + QMenuPrivate::get(m_sub_menu)->sloppyState.m_parent = nullptr; m_sub_menu = subMenu; QMenuPrivate::get(subMenu)->sloppyState.m_parent = this; m_reset_action = resetAction; @@ -2364,15 +2367,24 @@ void QMenu::popup(const QPoint &p, QAction *atAction) // Use d->popupScreen to remember, because initialScreenIndex will be reset after the first showing. // However if eventLoop exists, then exec() already did this by calling createWinId(); so leave it alone. (QTBUG-76162) if (!d->eventLoop) { + bool screenSet = false; const int screenIndex = d->topData()->initialScreenIndex; if (screenIndex >= 0) d->popupScreen = screenIndex; if (auto s = QGuiApplication::screens().value(d->popupScreen)) { if (d->setScreen(s)) d->itemsDirty = true; - } else if (d->setScreenForPoint(p)) { - d->itemsDirty = true; + screenSet = true; + } else if (QMenu *parentMenu = qobject_cast<QMenu *>(parent())) { + // a submenu is normally opened from an open parent menu, + // so show it on the same screen where the parent is. + if (QMenuPrivate::get(parentMenu)->windowHandle() && + d->setScreen(QMenuPrivate::get(parentMenu)->windowHandle()->screen())) + d->itemsDirty = true; + screenSet = true; } + if (!screenSet && d->setScreenForPoint(p)) + d->itemsDirty = true; } const bool contextMenu = d->isContextMenu(); |