【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安装程序,即可以完成打包软件的本地部署。

相关推荐
cyc&阿灿6 分钟前
Java中extends与implements深度解析:继承与接口实现的本质区别
java·开发语言
liujing102329292 小时前
Day13_C语言基础&项目实战
c语言·开发语言
周振超的2 小时前
c++编译第三方项目报错# pragma warning( disable: 4273)
开发语言·c++
JH30733 小时前
Java Stream API 在企业开发中的实战心得:高效、优雅的数据处理
java·开发语言·oracle
呆呆的小草6 小时前
Cesium距离测量、角度测量、面积测量
开发语言·前端·javascript
uyeonashi6 小时前
【QT系统相关】QT文件
开发语言·c++·qt·学习
冬天vs不冷7 小时前
Java分层开发必知:PO、BO、DTO、VO、POJO概念详解
java·开发语言
sunny-ll7 小时前
【C++】详解vector二维数组的全部操作(超细图例解析!!!)
c语言·开发语言·c++·算法·面试
猎人everest8 小时前
Django的HelloWorld程序
开发语言·python·django
嵌入式@秋刀鱼8 小时前
《第四章-筋骨淬炼》 C++修炼生涯笔记(基础篇)数组与函数
开发语言·数据结构·c++·笔记·算法·链表·visual studio code