前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Qt实现软件自动更新的一种简单方法

Qt实现软件自动更新的一种简单方法

作者头像
单片机点灯小能手
发布2020-07-16 17:59:45
2.9K0
发布2020-07-16 17:59:45
举报
文章被收录于专栏:电子电路开发学习

前言

最近在学习Qt开发上位机,想实现一个检查更新的功能,网上搜索了一大圈,发现实现过程都很复杂,关键是代码看不懂,所以就自己开发一种简单的方式来实现。实现效果如下:

点击“检查更新”按钮,如果当前版本低于远程的版本,那么会弹出如下窗口,提示更新,并显示远程的的版本号,更新时间,更新说明,如下图所示:

如果点击"去下载",那么会调用系统默认浏览器,直接创建下载任务。点击"不更新",则取消更新。

如果当前版本号和远程一致,那么会提示"已经是最新版本":

实现原理

首先在远程放置了一个文件,内容包含最新版软件的版本号、下载链接、更新时间、更新说明等,当用户点击"检查更新"时,会访问这个文件的地址,并对文件内容进行解析,得到最新的版本号、下载链接、更新时间、更新说明等,如果版本号比当前软件的版本号高,那么弹出更新窗口。

我们先创建一个文本文件,可以是TXT格式、XML格式、JSON格式等等,因为之前学习过JSON的解析,所以这里我选择了JSON格式,当然选择其他格式也都是可以的。命名为 software_update.json,内容如下:

代码语言:javascript
复制
{"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":"版本说明"    }}

其中Url键值,是最新版软件的下载地址,然后把这个文件存放到服务器上,可以通过链接直接访问, 如: https://www.demo.com/software_update.json,如果有软件发布,只需要修改这个文件的内容:版本号、下载链接、更新说明、更新时间。当然,从文件内容也可以看出,支持多个软件的说明放在一起。

Qt端的实现

Qt端的实现,主要使用到了网络请求和JSON解析两个部分。

1.pro文件添加网络支持
代码语言:javascript
复制
# 网络请求QT += network
2.添加头文件
代码语言:javascript
复制
//网络相关头文件#include <QtNetwork/QNetworkAccessManager>#include <QtNetwork/QNetworkRequest>#include <QtNetwork/QNetworkReply>//JSON相关头文件#include <QJsonDocument>#include <QJsonObject>#include <QJsonArray>
3.对象的定义和函数的声明
代码语言:javascript
复制
QNetworkAccessManager *manager;        //定义网络请求对象int parse_UpdateJSON(QString str);        //解析数据函数的声明
void replyFinished(QNetworkReply *reply);    //网络数据接收完成槽函数的声明
QString CurVerison = "V1.1";    //定义当前软件的版本号
4.连接信号与槽
代码语言:javascript
复制
manager = new QNetworkAccessManager(this);          //新建QNetworkAccessManager对象connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));//关联信号和槽
5.更新按钮槽函数的实现

当点击"检查更新"按钮,会发送一个网络请求,即上面的JSON文件的地址。

代码语言:javascript
复制
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.接收完成槽函数的实现

如果数据接收完成,那么会执行这个槽函数,函数里可以把接收的数据保存到文件,或者直接进行解析,由于数据量较小,这里选择了直接进行解析。

代码语言:javascript
复制
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数据进行解析,并弹出窗口,根据用户点击的按钮,执行对应的操作。

代码语言:javascript
复制
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用户点击状态的获取。通过这个功能的实现思路,我们也可以把软件上的一些文本和图片,通过远程来及时更新,如二维码等等。

历史精选

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 电子电路开发学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现原理
  • Qt端的实现
    • 1.pro文件添加网络支持
      • 2.添加头文件
        • 3.对象的定义和函数的声明
          • 4.连接信号与槽
            • 5.更新按钮槽函数的实现
              • 6.接收完成槽函数的实现
                • 7.JSON文件的解析
                • 总结
                • 历史精选
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档