summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/widgets/qmenu.cpp5
-rw-r--r--src/gui/widgets/qmenu_mac.mm15
2 files changed, 18 insertions, 2 deletions
diff --git a/src/gui/widgets/qmenu.cpp b/src/gui/widgets/qmenu.cpp
index 94df85c..d971ac2 100644
--- a/src/gui/widgets/qmenu.cpp
+++ b/src/gui/widgets/qmenu.cpp
@@ -1303,6 +1303,11 @@ void QMenu::initStyleOption(QStyleOptionMenuItem *option, const QAction *action)
do not support the signals: aboutToHide (), aboutToShow () and hovered ().
It is not possible to display an icon in a native menu on Windows Mobile.
+ \section1 QMenu on Mac OS X with Qt build against Cocoa
+
+ QMenu can be inserted only once in a menu/menubar. Subsequent insertions will
+ have no effect or will result in a disabled menu item.
+
See the \l{mainwindows/menus}{Menus} example for an example of how
to use QMenuBar and QMenu in your application.
diff --git a/src/gui/widgets/qmenu_mac.mm b/src/gui/widgets/qmenu_mac.mm
index 3f4cd43..4fc3d3d 100644
--- a/src/gui/widgets/qmenu_mac.mm
+++ b/src/gui/widgets/qmenu_mac.mm
@@ -1424,7 +1424,15 @@ QMenuPrivate::QMacMenuPrivate::syncAction(QMacMenuAction *action)
GetMenuItemProperty(action->menu, 0, kMenuCreatorQt, kMenuPropertyQWidget, sizeof(caused), 0, &caused);
SetMenuItemProperty(data.submenuHandle, 0, kMenuCreatorQt, kMenuPropertyCausedQWidget, sizeof(caused), &caused);
#else
- [item setSubmenu:static_cast<NSMenu *>(action->action->menu()->macMenu())];
+ NSMenu *subMenu = static_cast<NSMenu *>(action->action->menu()->macMenu());
+ if ([subMenu supermenu] != nil) {
+ // The menu is already a sub-menu of another one. Cocoa will throw an exception,
+ // in such cases. For the time being, a new QMenu with same set of actions is the
+ // only workaround.
+ action->action->setEnabled(false);
+ } else {
+ [item setSubmenu:subMenu];
+ }
#endif
} else { //respect some other items
#ifndef QT_MAC_USE_COCOA
@@ -1710,7 +1718,10 @@ QMenuBarPrivate::QMacMenuBarPrivate::syncAction(QMacMenuAction *action)
GetMenuItemProperty(action->menu, 0, kMenuCreatorQt, kMenuPropertyQWidget, sizeof(caused), 0, &caused);
SetMenuItemProperty(submenu, 0, kMenuCreatorQt, kMenuPropertyCausedQWidget, sizeof(caused), &caused);
#else
- [item setSubmenu:submenu];
+ if ([submenu supermenu] != nil)
+ return;
+ else
+ [item setSubmenu:submenu];
#endif
}
#ifndef QT_MAC_USE_COCOA