【问题标题】:How to rename the program-name menu-label in a MacOS/X program?如何在 MacOS/X 程序中重命名程序名称菜单标签?
【发布时间】:2021-02-24 21:04:55
【问题描述】:

我有一个在 MacOS/X 下运行的基于 Qt 的 GUI 程序,我希望能够更改该程序的第一个菜单标题的标签,即此屏幕截图中红色圈出的标签:

有没有一种程序化的方式来做到这一点?假设不存在基于 Qt 的解决方案,那么一个 Objective-C/“本机”解决方案就足够了。

一些背景信息(对于那些在这里正确怀疑 X/Y 问题的人):我的 MacOS/X 软件分发包括几个不同的基于 Qt 的程序,为了避免分发共享库的多个冗余副本,他们全部使用,并避免编写自定义安装程序,所有可执行文件都放置在同一 .app 包的 Contents/MacOS 子文件夹中,如下图所示:

要运行该软件,用户单击 .app 文件夹的图标以启动“主”应用程序,然后该 GUI 中有各种按钮/菜单可以根据需要将“其他”应用程序作为子进程启动;并且一切正常,除了子进程的第一个菜单标签始终显示为“主”应用程序的名称(如捆绑包的Info.plist 文件中的CFBundleExecutable 标签中所列)而不是子程序自己的名称,我希望能够更改它,以便它显示自己的程序名称。

【问题讨论】:

    标签: c++ objective-c macos cocoa menubar


    【解决方案1】:

    以下代码(Swift,应该很容易移植到 ObjC)更改菜单的名称:

    NSApp.mainMenu?.item(at: 0)?.submenu?.title = "child-program-name"
    

    但是,通过这种方法,一旦名称更改,菜单将不再以粗体显示,因为它与应用程序的名称不匹配。事实上,即使改回应用程序的名称,菜单标题也不再是粗体。这似乎是一个长期存在的问题;见set titles of items in my app's main menu?。不幸的是,NSMenu 没有像 NSMenuItem 这样的 attributedTitle 属性。

    【讨论】:

    • 嗯,我可以在 NSMenu 对象中设置标题字符串(请参阅我下一条评论中的代码),它确实更改了 [appMenu title] 返回的字符串,但它似乎不影响 on -屏幕菜单标签。我想知道 Apple 在最新版本的操作系统中是否对菜单名称进行了硬编码以阻止恶作剧?
    • 这是我使用的 Objective-C++ 代码(抱歉格式不好):#import <AppKit/NSApplication.h> #import <AppKit/NSMenu.h> void set_menu_program_name(const char * newName) { NSMenu *mainMenu = [[NSApplication sharedApplication] mainMenu]; NSMenu *appMenu = [[mainMenu itemAtIndex:0] submenu]; [appMenu setTitle:[[NSString alloc] initWithUTF8String:newName]]; }
    • 有趣的是,您发布的代码在 macOS 11.2.1 上对我有用(从 -applicationDidFinishLaunching: 调用,尽管我不知道这是否重要)。我记得看到一些旧线程,人们说他们需要在标题末尾添加一个非打印字符才能显示,这没有意义,但值得一试。你运行的是哪个 macOS 版本?
    • 啊,是的,从-applicationDidFinishLaunching: 调用它确实可以按预期工作(即使没有添加非打印字符),谢谢!当然,在 Qt 应用程序中,-applicationDidFinishLaunching: 不容易修改,但我可以将其作为一个单独的问题来解决。
    • 后人注意事项:通过从窗口类的 showEvent() 方法执行 QTimer::singleShot(1, this, SLOT(MyHackSlotMethod()));,然后调用我发布的 Objective-C++ 函数,我能够让它在我的 Qt 程序中工作在我上面来自MyHackSlotMethod()的评论中。请注意,set_menu_program_name() 函数可以将菜单标题更改为任何字符串 except 作为可执行文件名称的字符串(即除我想要使用的字符串之外的任何字符串)...所以我最终通过在字符串末尾添加一个空格来解决这个问题,正如@sbooth 建议的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多