QML:在关闭应用程序之前询问确认

QML: Asking confirmation before closing application

我有一个 QtQuick 应用程序。当用户试图关闭应用程序时,我希望弹出一个 "Are you sure?" window。

我的主要 C++ class 有这个:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    return app.exec();
}

我的主要 QML class 有一个应用程序 window:

ApplicationWindow {
    id: root
    ...
}

在哪里以及如何捕捉关闭事件?我阅读了有关从 QMainWindow 方法或其他方法覆盖 closeEvent() 的信息,但我没有 QMainWindow,而且我不知道该代码放在哪里。

所以我想知道如何防止应用程序关闭并发生其他事情,以及当用户在确认对话框中单击 "ok" 时我如何稍后关闭应用程序。

据我所知,ApplicationWindow 的 "onClosing" 只允许我在不可避免的关闭之前做一些清理,但它不会阻止关闭(如果我错了请纠正我)

我解决了

ApplicationWindow {
    id: root
    onClosing: close.accepted = false
}

这可以防止应用程序关闭。

root.close()

这将关闭应用程序。

//使用Qt 5.11.2 // 对于 android 和桌面

import QtQuick 2.9
import QtQuick.Controls 2.4
import QtQuick.Layouts 1.3
import QtQuick.Dialogs 1.2

ApplicationWindow {

    title: qsTr("xxxx xxxx")

    id: mainWindow
    visible: true


    //desision para salir
    MessageDialog {
        id: messageDialogQuit
        title: "Deseas salir?"
        icon: StandardIcon.Question
        text: "xxxxxxxxxxxxxxxxxxxxxxxxx."

        standardButtons: StandardButton.Yes |StandardButton.No
        //        Component.onCompleted: visible = true
        onYes: Qt.quit()
        //        onNo: console.log("didn't copy")
    }

    onClosing:{
        close.accepted = false
        onTriggered: messageDialogQuit.open()
    }

    menuBar: MenuBar {
        id: m_menu
        LayoutMirroring.enabled: true
        LayoutMirroring.childrenInherit: true
        anchors.left: parent.left
        Menu {
            title: qsTr("File")
            MenuItem {
                text: qsTr("Exit")
                onTriggered: messageDialogQuit.open()

            }

        }

    }
    width: 400
    height: 300

}
import QtQuick 2.13
import QtQuick.Layouts 1.12
import QtQuick.Controls 2.13
import QtQuick.Controls 1.4
import QtQuick.Dialogs 1.3

ApplicationWindow  {
   property bool closing: false

   MessageDialog {
      id: exitMessageDialogId
      icon: StandardIcon.Question
      text: "Are you sure to exit?"
      standardButtons: StandardButton.Yes | StandardButton.No
      onYes: {
         closing = true
         mainWindowId.close()
      }
   }
   onClosing: {
      close.accepted = closing
      onTriggered: if(!closing) exitMessageDialogId.open()
   }

   id: mainWindowId
}

在这种情况下,它只是关闭电流 window。