【QT】自动更新库QSimpleUpdater使用实例封装

【QT】自动更新库QSimpleUpdater使用实例封装

QSimpleUpdater 库

QSimpleUpdater是一个用于QT的开源自动更新库,它可以帮助开发者实现应用程序的版本检查和自动更新功能,官方的库下载可以从QSimpleUpdater获取,其中提供实例tutorial很推荐,可以通过tutorial.pro配置文件打开,直观的看到对JSON文件下载的使用介绍;其中QSimpleUpdater.pri是库的配置文件,可以导入进行库的使用。

信号介绍

在使用过程中,会涉及到3个信号的使用,如下:

其中appcastDownloadeddownloadFinished尤为要做好区分。

appcastDownloaded 信号

在库文件中,对这个信号使用有如下注释:

翻译过来就是:
如果customAppcast参数设置为true,则Updater不会尝试从服务器读取网络回复,而是会发出appcastDownloaded()信号,该信号允许应用程序自行读取和解释appcast文件。

这里面关于customAppcast参数设置,会在博文后面提到。在这里,可以理解为:如果customAppcast设置了true,那么appcastDownloaded会触发,此时可以在槽函数中对收到的原始数据进行自定义解析与使用;如果设置为false,则不会触发。

downloadFinished信号

在库文件中,对这个信号使用有如下注释:

翻译过来就是:
QSimpleUpdater还实现了一个集成的下载器,如果需要使用自定义安装过程/代码,只需创建一个函数,当向以下对象发出downloadFinished()信号时,调用该函数实现自己的安装过程。

这个解释还是比较直观的,可以理解为:需要自定义下载安装过程,可以用downloadFinished信号,然后在槽函数中进行自定义过程。

概括

概括起来流程就是如下图,appcastDownloaded 自定义传递的原始数据,downloadFinished自定义安装的方式。其中appcastDownloaded 触发必须要把customAppcast设置成true ,而且如果自定义了原始数据,那么downloadFinished信号就不会在触发了 ,当然不考虑在槽函数中手动触发。等2个信号都处理完成后,然后就会触发checkingFinished信号。

参数介绍

关于参数介绍可以首先可以看官方提供的实例tutorial,结合里面的UI界面进行了解,其中标红的6项刚好对应了6个参数的设置。

对于它的具体说明,在如下的代码注释中进行了具体说明:

cpp 复制代码
m_updater->setModuleVersion (url, qApp->applicationVersion());//当前版本号
m_updater->setNotifyOnFinish (url, false);//不显示所有通知
m_updater->setNotifyOnUpdate (url, true);//有更新时通知我
m_updater->setDownloaderEnabled (url, true);//启用集成的下载器
m_updater->setUseCustomAppcast (url, false);//不要使用QSU库对传递的原始数据进行解析
m_updater->setMandatoryUpdate(url, false);//不强制更新

这里因为涉及到了qApp->applicationVersion()的使用,因此在项目pro配置文件中需要进行VERSION = 1.0.0.0配置。

实例编写

在库使用过程中,需要返回一个版本信息,实例tutorial中采用的url是"https://raw.githubusercontent.com/alex-spataru/QSimpleUpdater/master/tutorial/definitions/updates.json";,但由于是github容易访问不到。因此,在实例编写前,建议先写一个服务端进行数据返回,返回格式可以参考updates.json 的格式,如果只使用一个平台,如windows,其实可以只写windows一项。

完成了服务端的设置,然后就可以进行实例的编写,具体需求如下:设置按钮,点击可以进行文件下载与更新,更新时候自动关闭当前程序。明确了需求,首先进行库的相关配置,由于测试需要,本博文中对三个信号都进行了信号处理,实际如果仅涉及到文件下载,其实只需要一个checkingFinished信号就行。

cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    if(m_updater==nullptr)
    {
        m_updater = QSimpleUpdater::getInstance();
        connect(m_updater,&QSimpleUpdater::checkingFinished,this,&MainWindow::checkingFinished);
        //对原始数据进行解析
        connect(m_updater,&QSimpleUpdater::appcastDownloaded, this,&MainWindow::displayAppcast);
        //自定义下载安装
        connect(m_updater,&QSimpleUpdater::downloadFinished,this,&MainWindow::downloadFinished);
        m_updater->setModuleVersion (url, qApp->applicationVersion());
        m_updater->setNotifyOnFinish (url, false);//不显示所有通知
        m_updater->setNotifyOnUpdate (url, true);//有更新时通知我
        m_updater->setDownloaderEnabled (url, true);//启用集成的下载器
        m_updater->setUseCustomAppcast (url, false);//不要使用QSU库对传递的原始数据进行解析
        m_updater->setMandatoryUpdate(url, false);//不强制更新
    }
    m_updater->checkForUpdates (url);
}

其次,涉及到自动关闭当前程序,虽然可以进行MandatoryUpdate强制更新的设置,但实际使用中会发现,操作较为繁琐,还会触发强制更新的提示。

因此,可以不设置MandatoryUpdate强制更新,而是进行downloadFinished信号的处理,自定义关闭当前程序与下载文件流程。

cpp 复制代码
void MainWindow::downloadFinished(const QString &url, const QString &filepath)
{
    qDebug()<<"-3-"<<filepath;
    QStringList d;
    d<<"/sp-"<<"/silent"<<"/norestart";//在不显示用户界面的情况下完成安装,并且安装结束后不重启系统
    QProcess::startDetached(filepath,d);// 启动外部程序并传入参数
    exit(1); // 终止当前应用,返回错误码1
}

完成了以上设计,就可以完成需求的实现,具体的客户端Updater已经上传。需要补充的是,关于QT生成的EXE程序,可以通过windeployqt 软件名.exe的方式进行打包,但是这样传递给他人使用还需要进行打包,较为繁琐。因此,这边推荐Inno Setup Compiler 工具,可以用于创建Windows安装程序,通过运行.iss配置文件完成文件的打包,最后输出一个EXE安装程序。运行这个EXE安装程序,即可以完成打包软件的本地部署。

相关推荐
cpp_learners1 小时前
QML与C++交互之创建自定义对象
c++·qt·qml
尘世闲鱼1 小时前
解数独(C++版本)
开发语言·c++·算法·解数独
纨妙2 小时前
python打卡day59
开发语言·python
wuxuanok2 小时前
Web后端开发-请求响应
java·开发语言·笔记·学习
Sally璐璐2 小时前
IPSAN 共享存储详解:架构、优化与落地实践指南
开发语言·php
像风一样的男人@2 小时前
python --货车装厢问题
开发语言·python
Humbunklung3 小时前
Rust枚举:让数据类型告别单调乏味
开发语言·后端·rust
Y1nhl3 小时前
力扣_链表_python版本
开发语言·python·算法·leetcode·链表·职场和发展
OEC小胖胖3 小时前
深入理解 Vue.js 响应式原理及其在 Web 前端开发中的应用
开发语言·前端·javascript·vue.js·web
qq_401700413 小时前
C语言中位运算以及获取低8位和高8位、高低位合并
c语言·开发语言·算法