1

在 Qt 4.8 我有这个代码:

    QMenuBar *menu_bar = menuBar(); //of my QMainWindow
    QMenu *help_menu = menu_bar->addMenu(tr("&Help"));
    QAction *about_qt_action = help_menu->addAction(tr("About &Qt"));
    connect(about_qt_action, SIGNAL(triggered()), qApp, SLOT(aboutQt()));

仅此一项就足以让 Qt 自动将 About Qt 菜单项移动到 OS X 10.8(可能还有其他版本)下的应用程序菜单。

现在使用 Qt 5.1,我的 About Qt 项目最终出现在 Help 菜单中,我必须手动设置 MenuRole 以恢复旧行为:

    about_qt_action->setMenuRole(QAction::AboutQtRole);

但是,文档说:

默认情况下,所有操作都有 TextHeuristicRole,这意味着操作是根据其文本添加的(有关更多信息,请参阅 QMenuBar)。

和:

Qt for Mac OS X 还提供了菜单栏合并功能,以使 QMenuBar 更接近于接受的 Mac OS X 菜单栏布局。合并功能基于匹配 QMenu 条目标题的字符串。这些字符串在“QMenuBar”上下文中被翻译(使用QObject::tr())。如果一个条目被移动,它的插槽仍然会触发,就好像它在原来的位置一样。下表概述了查找的字符串以及匹配项的放置位置:

...并且表格显示about.*移动到应用程序菜单的菜单。我的应用程序名为 Yua,除非我手动设置 MenuRole,否则以相同方式制作的“关于 Yua”QAction 也不会移动。我的 Info.plist 中有一个CFBundleNameCFBundleDisplayName条目。我错过了什么?

4

1 回答 1

0

我根本不会依赖启发式角色。恕我直言,它们是一个构思不周的功能。您应该在所有具有非默认角色的菜单操作上手动设置菜单角色。这里的所有都是它的。

于 2013-09-03T20:58:46.417 回答