前言
web
最近在学习Qt开发上位机,想实现一个检查更新的功能,网上搜索了一大圈,发现实现过程都很复杂,关键是代码看不懂,因此就本身开发一种简单的方式来实现。实现效果以下:json
点击“检查更新”按钮,若是当前版本低于远程的版本,那么会弹出以下窗口,提示更新,并显示远程的的版本号,更新时间,更新说明,以下图所示:浏览器
若是点击"去下载",那么会调用系统默认浏览器,直接建立下载任务。点击"不更新",则取消更新。服务器
若是当前版本号和远程一致,那么会提示"已是最新版本":微信
实现原理
首先在远程放置了一个文件,内容包含最新版软件的版本号、下载连接、更新时间、更新说明等,当用户点击"检查更新"时,会访问这个文件的地址,并对文件内容进行解析,获得最新的版本号、下载连接、更新时间、更新说明等,若是版本号比当前软件的版本号高,那么弹出更新窗口。网络
咱们先建立一个文本文件,能够是TXT格式、XML格式、JSON格式等等,由于以前学习过JSON的解析,因此这里我选择了JSON格式,固然选择其余格式也都是能够的。命名为 software_update.json
,内容以下:app
{"PulseSensor": { "LatestVerison":"V1.1", "Url":"https://www.demo.com/Demo_v1.1.exe", "UpdateTime":"2019-03-31", "ReleaseNote":"\n1.添加检查更新说明,包含版本号,下载连接,更新时间,更新说明.\n2.优化“关于”界面" },"RGBContrl": { "LatestVerison":"V1.0", "Url":"https://www.demo.com/Demo_v1.1.exe", "UpdateTime":"2019-03-30", "ReleaseNote":"版本说明" }}
函数
学习
flex
其中Url键值,是最新版软件的下载地址,而后把这个文件存放到服务器上,能够经过连接直接访问, 如: https://www.demo.com/software_update.json
,若是有软件发布,只须要修改这个文件的内容:版本号、下载连接、更新说明、更新时间。固然,从文件内容也能够看出,支持多个软件的说明放在一块儿。
Qt端的实现
Qt端的实现,主要使用到了网络请求和JSON解析两个部分。
1.pro文件添加网络支持
# 网络请求QT += network
2.添加头文件
//网络相关头文件#include <QtNetwork/QNetworkAccessManager>#include <QtNetwork/QNetworkRequest>#include <QtNetwork/QNetworkReply>//JSON相关头文件#include <QJsonDocument>#include <QJsonObject>#include <QJsonArray>
3.对象的定义和函数的声明
QNetworkAccessManager *manager; //定义网络请求对象int parse_UpdateJSON(QString str); //解析数据函数的声明void replyFinished(QNetworkReply *reply); //网络数据接收完成槽函数的声明QString CurVerison = "V1.1"; //定义当前软件的版本号
4.链接信号与槽
manager = new QNetworkAccessManager(this); //新建QNetworkAccessManager对象connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));//关联信号和槽
5.更新按钮槽函数的实现
当点击"检查更新"按钮,会发送一个网络请求,即上面的JSON文件的地址。
void Pulse::on_btn_chkUpdate_clicked(){ QNetworkRequest quest; quest.setUrl(QUrl("https://www.demo.com/software_update.json")); //包含最新版本软件的下载地址 quest.setHeader(QNetworkRequest::UserAgentHeader,"RT-Thread ART"); manager->get(quest); //发送get网络请求}
6.接收完成槽函数的实现
若是数据接收完成,那么会执行这个槽函数,函数里能够把接收的数据保存到文件,或者直接进行解析,因为数据量较小,这里选择了直接进行解析。
void Pulse::replyFinished(QNetworkReply *reply){ QString str = reply->readAll();//读取接收到的数据 // qDebug() << str; parse_UpdateJSON(str); //文件保存到本地/* QFile file("software_update.json"); if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) //append 内容追加在文件后面 { QMessageBox::critical(this, "错误", "文件打开失败,信息未写入", "肯定"); return; } QTextStream out(&file); out << str; //输出到文件 file.close(); //关闭文件 qDebug() << "文件保存成功!";// file.remove();// qDebug() << "文件已经删除";*/ reply->deleteLater(); //销毁请求对象}
7.JSON文件的解析
这个函数就是检查更新功能实现的核心了,对接收到的JSON数据进行解析,并弹出窗口,根据用户点击的按钮,执行对应的操做。
int Pulse::parse_UpdateJSON(QString str){ // QMessageBox msgBox; QJsonParseError err_rpt; QJsonDocument root_Doc = QJsonDocument::fromJson(str.toUtf8(),&err_rpt);//字符串格式化为JSON if(err_rpt.error != QJsonParseError::NoError) {// qDebug() << "root格式错误"; QMessageBox::critical(this, "检查失败", "服务器地址错误或JSON格式错误!"); return -1; } if(root_Doc.isObject()) { QJsonObject root_Obj = root_Doc.object(); //建立JSON对象,不是字符串 QJsonObject PulseValue = root_Obj.value("PulseSensor").toObject(); QString Verison = PulseValue.value("LatestVerison").toString(); //V1.0 QString Url = PulseValue.value("Url").toString(); //https://wcc-blog.oss-cn-beijing.aliyuncs.com/uFun_Pulse_v1.0.exe QString UpdateTime = PulseValue.value("UpdateTime").toString(); QString ReleaseNote = PulseValue.value("ReleaseNote").toString(); if(Verison > CurVerison) { QString warningStr = "检测到新版本!\n版本号:" + Verison + "\n" + "更新时间:" + UpdateTime + "\n" + "更新说明:" + ReleaseNote; int ret = QMessageBox::warning(this, "检查更新", warningStr, "去下载", "不更新"); if(ret == 0) //点击更新 { QDesktopServices::openUrl(QUrl(Url)); } } else QMessageBox::information(this, "检查更新", "当前已是最新版本!"); } return 0;}
总结
这样,若是之后有新版本软件发布,只须要更改远程文件的内容就好了。这个功能的实现主要用到了网络文件的读取,JSON的解析和QMessageBox用户点击状态的获取。经过这个功能的实现思路,咱们也能够把软件上的一些文本和图片,经过远程来及时更新,如二维码等等。
历史精选
欢迎你们关注个人我的博客
或微信扫码关注个人公众号
本文分享自微信公众号 - 电子电路开发学习(mcu149)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。