Qt實現軟件自動更新的一種簡單方法

前言
web

最近在學習Qt開發上位機,想實現一個檢查更新的功能,網上搜索了一大圈,發現實現過程都很複雜,關鍵是代碼看不懂,因此就本身開發一種簡單的方式來實現。實現效果以下:json

點擊「檢查更新」按鈕,若是當前版本低於遠程的版本,那麼會彈出以下窗口,提示更新,並顯示遠程的的版本號,更新時間,更新說明,以下圖所示:瀏覽器

若是點擊"去下載",那麼會調用系統默認瀏覽器,直接建立下載任務。點擊"不更新",則取消更新。服務器

若是當前版本號和遠程一致,那麼會提示"已是最新版本":微信


實現原理

首先在遠程放置了一個文件,內容包含最新版軟件的版本號、下載連接、更新時間、更新說明等,當用戶點擊"檢查更新"時,會訪問這個文件的地址,並對文件內容進行解析,獲得最新的版本號、下載連接、更新時間、更新說明等,若是版本號比當前軟件的版本號高,那麼彈出更新窗口。網絡

咱們先建立一個文本文件,能夠是TXT格式、XML格式、JSON格式等等,由於以前學習過JSON的解析,因此這裏我選擇了JSON格式,固然選擇其餘格式也都是能夠的。命名爲 software_update.json,內容以下:app

  
  
  
   
   
            
   
   
  1. 函數

  2. 學習

  3. flex

{"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文件添加網絡支持

  
  
  
   
   
            
   
   
# 網絡請求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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索