2017-10-11 76 views
0

我有一个在Windows和Mac上运行的应用程序。 该应用程序是用QML编写的。 我的QML代码中最外层的组件是ApplicationWindowApplicationWindow组件的API有一个名为menuBar的属性。 这里是一个虚拟的例子,它具有MenuBar和退出Action再现了这一点:QML如何处理Mac上菜单栏的应用程序退出?

ApplicationWindow { 
    id: _applicationWindow 

    visible: true 
    width: 640 
    height: 480 
    title: qsTr("Hello World") 

    Component.onCompleted: { 
     console.info("ApplicationWindow completed.") 
    } 

    menuBar: MenuBar { 
     Menu { 
      title: "File" 

      MenuItem { 
       action: Action { 
        id: _myQuttingAction 

        text: "Quit MyApp" 
        shortcut: "Ctrl+Q" 

        onTriggered: { 
         // deinit... 
         console.info("I got called!") 
         Qt.quit() 
        } 
       } 
      } 
     } 
    } 
} 

当我跑我的Mac上的应用程序下面的顶部菜单栏标题显示:

Apple Icon menu | MyApp | File

如果我下拉“文件”菜单这是我得到: MyApp's "File" menu drop down

正如你可以看到下拉列表是空的。实际上它不是空的,因为它是可按下的,如果我按下它,它会在动作的onTriggered事件中使用所有deinit调用退出我的应用程序。

如果我放下“MyApp”菜单,在底部我看到“退出MyApp”,其快捷键为Cmd+Q。如果我按下这个键,它也会退出我的应用程序,但是不会调用我的操作的事件,因此我的真实应用程序在退出时崩溃。

不幸的是,按Cmd+Q也会调用退出“MyApp”而不是我指定的操作。

在Windows上,我根本没有这个问题,“Quit MyApp”出现在“File”菜单下,并且做了我期望的操作。

我试图谷歌这个问题,并阅读文档没有运气呢。有人知道这里发生了什么?

回答

2

期望Qt退出会以某种方式奇迹般地使用您的特定菜单操作(这是完全可选的和任意的)是不现实的。

它可能不是你调用动作的快捷方式,但是内置的东西是平台特定的,比如Alt + F4如何在windoze上工作。

由于您使用ApplicationWindow可以实现自定义退出处理,将被使用,无论你怎么退出应用程序:

onClosing: { 
    // do your stuff 
    close.accepted = true // exits, if set to false the quit request will be ignored 
    } 

更新:既然你说预期上面的代码不工作,戒烟必须发生在甚至更低的级别,甚至不会通知qtquick,这也可以解释崩溃。我目前没有一台马科斯机器来研究它,但是,通过将处理器连接到QCoreApplication::aboutToQuit()信号,你有可能获得它的退出属性。

+0

嗨@dtech,设置'close.accepted = false'仍然会让我的应用程序退出,甚至尝试使用上面的虚拟示例。 – Silex

+0

为什么字符串“退出MyApp”出现在“文件”菜单下拉? – Silex

+0

@Silex看到更新,除了我目前没有想法,其他人可能会提供帮助。 – dtech

相关问题