为什么我必须在Qt 5.1中手动指定QAction::MenuRole

Why do I have to manually specify the QAction::MenuRole in Qt 5.1?

本文关键字:QAction MenuRole Qt 为什么      更新时间:2023-10-16

在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自动将"关于Qt"菜单项移动到OS X 10.8下的应用程序菜单中(可能还有其他版本)。

现在有了Qt 5.1,我的"关于Qt"项目最终出现在"帮助"菜单中,我必须手动设置MenuRole才能恢复原来的行为:

    about_qt_action->setMenuRole(QAction::AboutQtRole);

然而,文件显示:

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

和:

Qt for Mac OS X还提供了菜单栏合并功能,使QMenuBar更符合公认的Mac OS X菜单栏布局。合并功能基于与QMenu条目标题匹配的字符串。这些字符串在"QMenuBar"上下文中进行翻译(使用QObject::tr())。如果一个入口被移动,其插槽仍将像在原来的位置一样启动。下表列出了要查找的字符串以及匹配项的放置位置:

并且该表示出了移动到应用菜单的菜单的CCD_ 1。我的应用程序名为Yua,除非我手动设置MenuRole,否则以相同方式生成的"About Yua"QAction也不会移动。在我的Info.plist中有一个CFBundleNameCFBundleDisplayName条目。我缺少什么?

我根本不会依赖启发式角色。他们是IMHO,这是一个考虑不周的特点。您应该在所有具有非默认角色的菜单操作上手动设置菜单角色。这就是它的全部。