内容简介:最近在学习Qt开发上位机,想实现一个点击“检查更新”按钮,如果当前版本低于远程的版本,那么会弹出如下窗口,提示更新,并显示远程的的版本号,更新时间,更新说明,如下图所示:
前言
最近在学习Qt开发上位机,想实现一个 检查更新 的功能,网上搜索了一大圈,发现实现过程都很复杂,关键是代码看不懂,所以就自己开发一种简单的方式来实现。实现效果如下:
点击“检查更新”按钮,如果当前版本低于远程的版本,那么会弹出如下窗口,提示更新,并显示远程的的版本号,更新时间,更新说明,如下图所示:
如果点击”去下载”,那么会调用系统默认浏览器,直接创建下载任务。点击”不更新”,则取消更新。
如果当前版本号和远程一致,那么会提示”已经是最新版本”:
; //解析数据函数的声明 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/QtUpdate/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用户点击状态的获取。通过这个功能的实现思路,我们也可以把软件上的一些文本和图片,通过远程来及时更新,如二维码等等。
历史精选
- JSON简介
- 使用cJSON库解析JSON
- 基于uFUN开发板的心率计(一)DMA方式获取传感器数据
- 【UFUN开发板评测】小巧而不失精致,简单而不失内涵——uFun开发板开箱爆照
- 如何使用串口来给STM32下载程序
- STM32串口打印输出乱码的解决办法
- Keil报错:cannot open source input file “core_cmInstr.h” 解决办法
欢迎大家关注我的个人博客
或微信扫码关注我的公众号
以上所述就是小编给大家介绍的《Qt实现软件自动更新的一种简单方法》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 网游丨一月一更新,一更更一月,如何实现热更新?
- iOS后台模式借助位置更新实现
- 如何在OpenResty里实现代码热更新
- Flutter 实现 App 内更新安装包
- Flink-Cep 实现规则动态更新
- 利用GitHub实现简单的个人App版本更新
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Music Recommendation and Discovery
Òscar Celma / Springer / 2010-9-7 / USD 49.95
With so much more music available these days, traditional ways of finding music have diminished. Today radio shows are often programmed by large corporations that create playlists drawn from a limited......一起来看看 《Music Recommendation and Discovery》 这本书的介绍吧!