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。
我有一个 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。