【QT】自动更新库QSimpleUpdater使用实例封装
【QT】自动更新库QSimpleUpdater使用实例封装
- QSimpleUpdater 库
- 信号介绍
- appcastDownloaded 信号
- downloadFinished信号
- 概括
- 参数介绍
- 实例编写
QSimpleUpdater 库
QSimpleUpdater是一个用于QT的开源自动更新库,它可以帮助开发者实现应用程序的版本检查和自动更新功能,官方的库下载可以从QSimpleUpdater获取,其中提供实例tutorial很推荐,可以通过tutorial.pro
配置文件打开,直观的看到对JSON文件下载的使用介绍;其中QSimpleUpdater.pri
是库的配置文件,可以导入进行库的使用。
信号介绍
在使用过程中,会涉及到3个信号的使用,如下:
其中appcastDownloaded
和downloadFinished
尤为要做好区分。
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个参数的设置。
对于它的具体说明,在如下的代码注释中进行了具体说明:
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信号就行。
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信号的处理,自定义关闭当前程序与下载文件流程。
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已经上传。