2017-10-11 78 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

相關問題