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

QML: Asking confirmation before closing application

本文关键字:确认 应用程序 QML      更新时间:2023-10-16

我有一个QtQuick应用程序。当用户尝试关闭应用程序时,我希望弹出一个"你确定吗?"窗口。

我的主要C++课是这样的:

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

我的主要 QML 类有一个应用程序窗口:

ApplicationWindow {
    id: root
    ...
}

我将在哪里以及如何捕捉到关闭事件?我从QMainWindow方法或其他东西中读到了覆盖closeEvent(),但我没有QMainWindow,我不知道我会把代码放在哪里。

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

据我所知,应用程序窗口的"onClosesing"只允许我在不可避免的关闭之前进行一些清理,但它不会阻止关闭(如果我错了,请纠正我)

我解决了。

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

这会阻止应用关闭。

root.close()

这将关闭应用。

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
}

在这种情况下,它只是关闭当前窗口。

//use Qt 5.11.2适用于安卓 y 桌面

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
}