【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已經上傳。需要補充的是,關于QT生成的EXE程序,可以通過windeployqt 軟件名.exe
的方式進行打包,但是這樣傳遞給他人使用還需要進行打包,較為繁瑣。因此,這邊推薦Inno Setup Compiler工具,可以用于創建Windows安裝程序,通過運行.iss
配置文件完成文件的打包,最后輸出一個EXE安裝程序。運行這個EXE安裝程序,即可以完成打包軟件的本地部署。