macOS / Qt:禁用我的应用程序停靠栏菜单上的 "Quit" 菜单项
macOS / Qt: Disabling the "Quit" menu item on my application's dock menu
我正在使用 Qt 编写 macOS 应用程序。此应用程序是一个启动代理,这意味着它由 launchd 启动,并且始终 运行 在后台运行。通常应用程序只有一个菜单栏图标,没有任何打开的 windows 或 Dock 图标。 (即共享 NSApplication 实例的 activationPolicy
属性 设置为 NSApplicationActivationPolicyAccessory
的值。)
但是,它的菜单栏项中有一些可用的菜单项可以打开一些 windows,当这些 windows 打开时,应用程序将不再仅在后台运行,所以它将有一个 Dock 图标和菜单栏。 (即 activationPolicy
更改为 NSApplicationActivationPolicyRegular
。)有了 Dock 图标,这意味着用户可以右键单击它并打开它的菜单,并且该菜单具有其默认菜单项正在退出应用程序。
虽然该应用程序是一个启动代理,并且旨在始终 运行,但退出它只会导致 launchd 重新启动该应用程序。如果可能,我想禁用或删除此菜单项,或者以其他方式阻止用户以这种方式退出应用程序。
有什么办法吗?如果有一种方法可以完全使用 Qt 的函数来完成这个,那会很棒,但如果没有,我也可以使用 macOS 特定的函数。
我应该补充一点,因为这是一个 Qt 应用程序,我不能使用概述的相同方法 here 因为我无权访问该应用程序的委托。我需要使用另一种方法。 (例如,可以在 Qt 的应用程序委托上调配方法,但如果有比我更愿意这样做的更简洁的方法来完成此操作。)
经过更多研究后,我发现无法从应用程序的 Dock 菜单中删除 "Quit" 菜单项,或者在创建和处理时删除其中的任何其他标准菜单项由码头本身。
当用户通过 Dock 退出应用程序时,可以阻止应用程序退出。在 Qt 应用程序中,该方法是继承 QApplication
并覆盖其 bool event(QEvent *)
方法。覆盖的方法应该检查 QEvent::Close
类型的事件,调用事件的 ignore()
方法,然后 return true
。请注意,这也会阻止应用程序通过所有其他常规方法退出。
编辑:也可以通过 Dock 判断应用程序何时退出,至少在使用 Apple 的原生 API 时是这样。参见:
通过使用 Objective-C 方法调配,可以覆盖 Qt 应用程序委托的 applicationShouldTerminate:
方法并防止 Qt 应用程序被停靠栏退出。
我正在使用 Qt 编写 macOS 应用程序。此应用程序是一个启动代理,这意味着它由 launchd 启动,并且始终 运行 在后台运行。通常应用程序只有一个菜单栏图标,没有任何打开的 windows 或 Dock 图标。 (即共享 NSApplication 实例的 activationPolicy
属性 设置为 NSApplicationActivationPolicyAccessory
的值。)
但是,它的菜单栏项中有一些可用的菜单项可以打开一些 windows,当这些 windows 打开时,应用程序将不再仅在后台运行,所以它将有一个 Dock 图标和菜单栏。 (即 activationPolicy
更改为 NSApplicationActivationPolicyRegular
。)有了 Dock 图标,这意味着用户可以右键单击它并打开它的菜单,并且该菜单具有其默认菜单项正在退出应用程序。
虽然该应用程序是一个启动代理,并且旨在始终 运行,但退出它只会导致 launchd 重新启动该应用程序。如果可能,我想禁用或删除此菜单项,或者以其他方式阻止用户以这种方式退出应用程序。
有什么办法吗?如果有一种方法可以完全使用 Qt 的函数来完成这个,那会很棒,但如果没有,我也可以使用 macOS 特定的函数。
我应该补充一点,因为这是一个 Qt 应用程序,我不能使用概述的相同方法 here 因为我无权访问该应用程序的委托。我需要使用另一种方法。 (例如,可以在 Qt 的应用程序委托上调配方法,但如果有比我更愿意这样做的更简洁的方法来完成此操作。)
经过更多研究后,我发现无法从应用程序的 Dock 菜单中删除 "Quit" 菜单项,或者在创建和处理时删除其中的任何其他标准菜单项由码头本身。
当用户通过 Dock 退出应用程序时,可以阻止应用程序退出。在 Qt 应用程序中,该方法是继承 QApplication
并覆盖其 bool event(QEvent *)
方法。覆盖的方法应该检查 QEvent::Close
类型的事件,调用事件的 ignore()
方法,然后 return true
。请注意,这也会阻止应用程序通过所有其他常规方法退出。
编辑:也可以通过 Dock 判断应用程序何时退出,至少在使用 Apple 的原生 API 时是这样。参见:
通过使用 Objective-C 方法调配,可以覆盖 Qt 应用程序委托的 applicationShouldTerminate:
方法并防止 Qt 应用程序被停靠栏退出。