QML如何处理Mac上菜单栏中的应用退出?

时间:2017-10-11 10:35:52

标签: qt qml

我有一个在Windows和Mac上运行的应用程序。 该应用程序是用QML编写的。 我的QML代码中最外层的组件是ApplicationWindowApplicationWindow组件的API具有名为menuBar的属性。 这是一个虚拟示例,使用MenuBar和退出Action重现这一点:

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。如果我按下这个,这也会退出我的应用程序,但是没有调用我的操作onTriggered事件,因此我的实际应用程序在退出时崩溃。

不幸的是,按Cmd+Q也会调用" MyApp"不是我指定的行动。

在Windows上,我根本没有遇到这个问题,并且退出MyApp"出现在"文件"菜单,做我期望它做的事。

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

1 个答案:

答案 0 :(得分: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,这也可以解释崩溃。我目前没有macos机器可以查看它,但是你可以通过将处理程序挂钩到QCoreApplication::aboutToQuit()信号来获得退出属性。