我有一个在Windows和Mac上运行的应用程序。
该应用程序是用QML编写的。
我的QML代码中最外层的组件是ApplicationWindow
。
ApplicationWindow
组件的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
如您所见,下拉列表为空。实际上它并不是空的,因为它是可按下的,如果我按下它,它会在动作的onTriggered
事件中退出所有deinit调用。
如果我放下" MyApp"菜单,在底部,我看到"退出MyApp"使用快捷方式Cmd+Q
。如果我按下这个,这也会退出我的应用程序,但是没有调用我的操作onTriggered
事件,因此我的实际应用程序在退出时崩溃。
不幸的是,按Cmd+Q
也会调用" MyApp"不是我指定的行动。
在Windows上,我根本没有遇到这个问题,并且退出MyApp"出现在"文件"菜单,做我期望它做的事。
我试图谷歌这个问题并且没有运气就阅读了文档。有人知道这里发生了什么吗?
答案 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()
信号来获得退出属性。