关闭程序时弹一个确认提示框是很常见的功能,下面是本文 Demo 运行效果:
在 QML 中,有三种常见的关闭应用的方式:
import QtQuick 2.9
import QtQuick.Window 2.9
import QtQuick.Controls 2.9
Window {
id: root
visible: true
width: 640
height: 480
title: qsTr("GongJianBo 1992")
Column{
spacing: 10
Button{
text: "Quit"
//调用Qt.quit不会进onClosing
onClicked: Qt.quit()
}
Button{
text: "Exit"
//调用Qt.exit不会进onClosing
onClicked: Qt.exit(0)
}
Button{
text: "Close"
//调用Window.close会进onClosing
onClicked: root.close()
}
}
//可能是qmltype信息不全,有M16警告,这里屏蔽下
//@disable-check M16
onClosing: function(closeevent){
//CloseEvent的accepted设置为false就能忽略该事件
closeevent.accepted = false
}
}
其中,调用 Window 类型的 close 函数,或者点击默认标题栏的关闭按钮,会触发 closing 信号。该信号带有一个 CloseEvent 的参数,我们将该参数的 accepted 属性设置为 false ,这个关闭事件就会被忽略掉。
参见文档:https://doc.qt.io/qt-5/qml-qtquick-window-closeevent.html
参见文档:https://doc.qt.io/qt-5/qquickwindow.html#closing
但是我个人比较喜欢用 Qt.quit() 的方式退出程序,而这个调用是不会触发 Window 的 closing 信号的。在这个调用方式里,Qt 应该表示的是 QQmlEngine 实例,所以我们直接去源码里看看他怎么处理的:
void QQmlApplicationEnginePrivate::init()
{
Q_Q(QQmlApplicationEngine);
q->connect(q, &QQmlApplicationEngine::quit, QCoreApplication::instance(),
&QCoreApplication::quit, Qt::QueuedConnection);
q->connect(q, &QQmlApplicationEngine::exit, QCoreApplication::instance(),
&QCoreApplication::exit, Qt::QueuedConnection);
q->connect(q, SIGNAL(uiLanguageChanged()), q_func(), SLOT(_q_loadTranslations()));
#if QT_CONFIG(translation)
QTranslator* qtTranslator = new QTranslator(q);
if (qtTranslator->load(QLocale(), QLatin1String("qt"), QLatin1String("_"), QLibraryInfo::location(QLibraryInfo::TranslationsPath), QLatin1String(".qm")))
QCoreApplication::installTranslator(qtTranslator);
else
delete qtTranslator;
#endif
new QQmlFileSelector(q,q);
QCoreApplication::instance()->setProperty("__qml_using_qqmlapplicationengine", QVariant(true));
}
可以看到,他直接把 QQmlEngine 的退出信号关联到了 QApplication 实例的退出函数。不过他这个不是从虚函数触发的,所以继承重写的方式不大好使,于是我就 disconnect 了他默认的信号槽链接,然后 connect 到自定义的槽函数:
QObject::disconnect(&engine,&QQmlApplicationEngine::quit,nullptr,nullptr);
QObject::disconnect(&engine,&QQmlApplicationEngine::exit,nullptr,nullptr);
QObject::connect(&engine,&QQmlApplicationEngine::quit,[]{
qDebug()
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?