您当前的位置: 首页 > 

龚建波

暂无认证

  • 2浏览

    0关注

    313博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

QML实现程序退出确认功能

龚建波 发布时间:2020-08-27 23:38:35 ,浏览量:2

关闭程序时弹一个确认提示框是很常见的功能,下面是本文 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()            
关注
打赏
1655829268
查看更多评论
0.1341s