macOS / Qt:在应用程序的停靠菜单上禁用“退出”菜单项

时间:2019-07-15 23:26:24

标签: macos qt dock

我已经用Qt编写了macOS应用程序。该应用程序是启动代理,这意味着它是通过启动启动的,并且始终在后台运行。通常,该应用程序只有一个菜单栏图标,并且没有任何打开的窗口或Dock图标。 (即,共享的NSApplication实例的activationPolicy属性设置为NSApplicationActivationPolicyAccessory的值。)

但是,它的菜单栏项中有一些菜单项可用来打开一些窗口,当这些窗口打开时,该应用程序将不再切换为仅背景,因此它将具有Dock图标和菜单栏。 (即activationPolicy更改为NSApplicationActivationPolicyRegular。)有了Dock图标,这意味着用户可以右键单击它并打开其菜单,并且该菜单的默认菜单项为退出应用程序。

但是,由于该应用程序是启动代理,并且旨在始终运行,因此退出该应用程序只会导致启动后重新启动该应用程序。如果可能,我想禁用或删除此菜单项,否则将阻止用户以这种方式退出应用程序。

有没有办法做到这一点?如果有一种方法可以纯粹使用Qt的功能来实现这一点,那还是不错的,但如果不能,我也可以使用macOS特定的功能。

我应该补充一点,因为这是一个Qt应用程序,所以我无法使用概述的here相同的方法,因为我无权访问该应用程序的委托。我将需要使用另一种方法。 (例如,也许有可能在Qt的应用程序委托上混淆方法,尽管如果有比我更喜欢的一种更干净的方法来实现此目的,则可以这样做。)

1 个答案:

答案 0 :(得分:0)

进行更多研究后,我发现无法从应用程序的Dock菜单中删除“ Quit”菜单项,也无法从Dock本身创建和处理的菜单中删除其他任何标准菜单项

当用户通过Dock退出应用程序时,可以阻止其退出。在Qt应用程序中,该方法是子类QApplication并覆盖其bool event(QEvent *)方法。重写的方法应检查类型为QEvent::Close的事件,对该事件调用ignore()方法,然后返回true。但是请注意,这也会阻止应用程序通过所有其他常规方法退出。

edit:至少在使用Apple的本机API时,也可以知道何时通过Dock退出应用程序。参见:macOS: Is there any way to know when the user has tried to quit an application via its Dock icon?

通过使用Objective-C方法,可以重写Qt的应用程序委托的applicationShouldTerminate:方法,并防止Qt应用程序被扩展坞退出。