如何禁用应用程序停靠菜单上的“退出”菜单项

问题描述 投票:0回答:1

我用 Qt 编写了一个 macOS 应用程序。该应用程序是一个启动代理,这意味着它由launchd启动,并且始终在后台运行。

通常,应用程序只有一个菜单栏图标,没有任何打开的窗口或停靠栏图标。 (即,共享 NSApplication 实例的

activationPolicy
属性设置为值
NSApplicationActivationPolicyAccessory
。)

但是,其菜单栏项目中有一些可用的菜单项,可以打开一些窗口。

当这些窗口打开时,应用程序将不再仅在后台切换,因此它将有一个停靠图标和一个菜单栏(即,

activationPolicy
更改为
NSApplicationActivationPolicyRegular
。)。

有了停靠图标,这意味着用户可以右键单击它并打开其菜单,并且该菜单具有用于退出应用程序的默认菜单项。

由于该应用程序是启动代理,并且旨在始终运行,因此退出它只会导致 launchd 重新启动该应用程序。

如果可能,我想禁用或删除此菜单项,或者以其他方式阻止用户以这种方式退出应用程序。

我如何实现这一点:

  • 纯Qt函数
  • macOS 特定功能。

我应该补充一点,因为这是一个 Qt 应用程序,所以我无法使用此处概述的相同方法,因为我无权访问应用程序的委托。

我需要使用另一种方法。 (例如,可能可以在 Qt 的应用程序委托上混合方法,但如果有更干净的方法来完成此操作,我宁愿这样做。)

macos qt menu dock
1个回答
1
投票

经过更多研究,我发现无法从应用程序的 Dock 菜单中删除“退出”菜单项,或任何其他标准菜单项,因为它们是由 Dock 本身创建和处理的。

当用户通过 Dock 退出应用程序时,可以阻止应用程序退出。在 Qt 应用程序中,该方法是子类

QApplication
并重写其
bool event(QEvent *)
方法。重写的方法应检查类型为
QEvent::Close
的事件,对事件调用
ignore()
方法,然后返回
true
。但请注意,这也会阻止应用程序通过所有其他传统方法退出。

编辑:还可以通过 Dock 判断应用程序何时退出,至少在使用 Apple 的本机 API 时是这样。请参阅:macOS:有什么方法可以知道用户何时尝试通过其 Dock 图标退出应用程序?

通过使用 Objective-C 方法混合,可以覆盖 Qt 应用程序委托的

applicationShouldTerminate:
方法并防止 Qt 应用程序被 Dock 退出。

© www.soinside.com 2019 - 2024. All rights reserved.