相关文章推荐
仗义的火腿肠  ·  改变osg ...·  10 月前    · 
拉风的蘑菇  ·  NSIS:判断并安装.NET ...·  1 年前    · 
心软的红金鱼  ·  kubeadm init cannot ...·  1 年前    · 
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);
        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()<<"quit";
        if(QMessageBox::warning(nullptr,"提示","确认退出?",
                             QMessageBox::Ok|QMessageBox::Cancel)==QMessageBox::Ok)
            qApp->quit();
    QObject::connect(&engine,&QQmlApplicationEngine::exit,[](int code){
        qDebug()<<"exit"<<code;
        if(QMessageBox::warning(nullptr,"提示","确认退出?",
                             QMessageBox::Ok|QMessageBox::Cancel)==QMessageBox::Ok)
            qApp->quit();

到此,功能也就实现了,剩下的就是美化提示框,以及处理相关逻辑。

本文完整代码链接:https://github.com/gongjianbo/MyTestCode/tree/master/Qml/QmlCloseEvent

id:myMsgbox standardButtons: StandardButton.Yes | StandardButton.No modality: Qt.ApplicationModal title: "确认退出" text:"你确定要退出商旅平台吗?" 在上面的代码中,我们创建了一个应用程序窗口,并在它的内部创建了一个蓝色矩形。当用户在矩形内部点击时,在 QML 中,我们可以通过点击事件来关闭窗口。指代的是当前的矩形对象,而不是窗口对象。注意,在上面的代码中,我们使用的是。方法来关闭当前窗口。方法来关闭当前窗口。 Window 对象为 Qt Quick 场景创建一个顶级窗口。 Window 可以在 Item 内或在另一个 Window 内声明,在这种情况下,内部窗口将自动变为外部窗口的“瞬态”:即,默认情况下,大多数平台将显示它以外部窗口为中心。 import QtQuick 2.14 import QtQuick.Window 2.14 Window { width: 640 height: 480 visible: true title: qsTr("Hello ❝本文介绍,解决使用QtCreator默认创建的一个空的Qml项目工程,从网络中加载Qml控件却一直没效果的问题。❞1. 问题重现  先看下main.cpp的main函数。intmain(intargc,char*argv[]){...QQmlApplicationEngineengine;engine.load(QUrl(QStringLiteral(... 在使用浏览器时,我们经常会用到全屏模式,最常见的场景有:观看视频、阅读文章、在线演示等。全屏模式的优点在于,它可以让用户充分地利用有限的屏幕空间,更好地专注于内容本身,从而提供丰富的沉浸式视觉体验。