【QT】自动更新库QSimpleUpdater使用实例封装

【QT】自动更新库QSimpleUpdater使用实例封装

  • QSimpleUpdater 库
    • 信号介绍
      • appcastDownloaded 信号
      • downloadFinished信号
      • 概括
    • 参数介绍
  • 实例编写

QSimpleUpdater 库

QSimpleUpdater是一个用于QT的开源自动更新库,它可以帮助开发者实现应用程序的版本检查和自动更新功能,官方的库下载可以从QSimpleUpdater获取,其中提供实例tutorial很推荐,可以通过tutorial.pro配置文件打开,直观的看到对JSON文件下载的使用介绍;其中QSimpleUpdater.pri是库的配置文件,可以导入进行库的使用。

信号介绍

在使用过程中,会涉及到3个信号的使用,如下:
在这里插入图片描述
其中appcastDownloadeddownloadFinished尤为要做好区分。

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安装程序,即可以完成打包软件的本地部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx、CDN、 DNS的关系解析

文章目录 Nginx 与 CDN 的关系1. 角色定位2. 协作方式3. 自建 CDN vs. 第三方 CDN Nginx 与 DNS 的关系1. 角色定位2. 协作方式3. 性能优化 CDN 与 DNS 的关系1. 角色定位2. 协作方式3. 高级 DNS 技术 三者结合的典型架构总结 Nginx、CDN 和 DNS 是现代网络架构中的三个关键组件…

PH热榜 | 2025-06-13

1. Flowstep 标语&#xff1a;借助人工智能&#xff0c;瞬间设计出美观的用户界面。 介绍&#xff1a;Flowstep 是您的 AI 设计助手&#xff0c;将简单的文字提示转化为用户界面设计、线框图和流程图。它能加速您的工作流程&#xff0c;让您轻松迭代&#xff0c;内置建议帮助…

Spectacular AI Gemini2 跑通实时建图

参考链接&#xff1a;Spectacular AI 硬件设备 gemini2 测试了gemini335没成功 修改record.cpp 仓库链接&#xff1a;sdk 读取Timu_cam ros2 run tf2_ros tf2_echo imu坐标系&#xff08;加速度计和陀螺仪都可以&#xff0c;两者变换为单位阵&#xff09;camera_rgb_optic…

简析MDM在餐饮设备中的部署与应用

引言&#xff1a;科技驱动餐饮运营升级 在竞争激烈的餐饮行业&#xff0c;科技已成为提升服务质量和运营效率的关键。从自助点餐机、数字菜单牌&#xff0c;到移动收银系统&#xff0c;智能设备已经深入餐厅的日常运营。然而&#xff0c;随着设备数量和种类的增加&#xff0c;…

RocketMQ总结

深入理解RocketMQ三高架构设计 高性能 顺序写磁盘 mmap 零拷贝异步刷盘 刷盘策略可配置轻量网络协议 长连接复用 高可用 主从复制机制、controller、dledger集群NameServer 多副本无状态客户端自动切换 Broker消息刷盘机制保障可靠性 高可扩展性 Broker 水平扩展Consu…

vue3+tdesign实现明暗主题切换

很多项目中有些会涉及到明暗主题切换的功能&#xff0c;今天就来梳理一下有关这方面的具体实现步骤和使用到的方法&#xff0c;本篇文章使用到的组件是tdesign&#xff0c;利用部分案例&#xff0c;主要阐述明暗主题切换的技术原理和实现步骤&#xff0c;仅供参考。 目录 一、…

goland 的 dug 设置

brew install delve # 或通过go install go install github.com/go-delve/delve/cmd/dlvlatestwhere dlvdlv.path/your/path/to/dlv环境变量 DEPLOY_MODEprivate;EGO_DEBUGtrue;EGO_MODEdev;MO_MODEdev;PD_MODEco;PRODUCT_MODEall

CVE-2020-1938源码分析与漏洞复现(Tomcat 文件包含/读取)

漏洞概述 漏洞名称&#xff1a;Tomcat AJP协议文件包含/读取漏洞&#xff08;Ghostcat&#xff09; CVE 编号&#xff1a;CVE-2020-1938 CVSS 评分&#xff1a;9.8 影响版本&#xff1a; Apache Tomcat 6.x (≤ 6.0.53)Apache Tomcat 7.x (≤ 7.0.99)Apache Tomcat 8.x (≤ 8…

基于51单片机的简易打铃系统

目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 具体功能&#xff1a; &#xff08;1&#xff09;实时显示当前时间&#xff08;时、分、秒&#xff09;&#xff0c;LED模式指示灯亮&#xff1b;4个按键可以调整时间的时和分。 &#xff08;2&…

vue+cesium示例:3D热力图(附源码下载)

接到一位知识星友的邀请&#xff0c;随机模拟三维数据点&#xff0c;结合heatmap.js实现基于cesiumvue的3D热力图需求&#xff0c;适合学习Cesium与前端框架结合开发3D可视化项目。 demo源码运行环境以及配置 运行环境&#xff1a;依赖Node安装环境&#xff0c;demo本地Node版本…

批处理实现:自动抓取perfetto日志 自动导出到当前文件夹 自动打开分析页面

序言 最近在研究性能问题需要抓取trace文件。于是写了个脚本 使用 双击运行批处理文件&#xff0c;可以开始记录trace。而且以当前文件夹下面的。config.pbtx 作为配置文件。 &#xff08;pbtx就是一个json文件。配置了需要抓取那些参数&#xff0c;可以通过https://ui.per…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

​​Promise代码理解

1.事件循环与 Promise 执行顺序 案例 1&#xff1a;基础 Promise 同步异步区分 console.log(1); new Promise(resolve > {console.log(2);resolve();console.log(3); }).then(() > console.log(4)); console.log(5); 输出顺序&#xff1a;1&#xff0c;2&#xff0c;3…

57、原生组件注入-【源码分析】DispatcherServlet注入原理

57、原生组件注入DispatcherServlet注入原理 #### 继承关系 - DispatcherServlet继承自FrameworkServlet&#xff0c;而FrameworkServlet继承自HttpServletBean&#xff0c;最终HttpServletBean继承自HttpServlet。 - DispatcherServlet实现了ApplicationContextAware接口。 …

【动手学深度学习】3.5. 图像分类数据集

目录 3.5. 图像分类数据集1&#xff09;读取数据集2&#xff09;读取小批量3&#xff09;整合所有组件4&#xff09;小结 . 3.5. 图像分类数据集 我们将使用Fashion-MNIST数据集&#xff0c;作为图像分类数据集。 %matplotlib inline import torch import torchvision from …

Python的格式化输入输出

# Python 的格式化输出和格式化输入## 格式化输出Python 提供了多种字符串格式化的方法&#xff1a;### 1. % 格式化&#xff08;旧式格式化&#xff09;python name "Alice" age 25 print("Name: %s, Age: %d" % (name, age)) # 输出: Name: Alice, Age…

day65—回溯—单词搜索(LeetCode-79)

题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相…

iOS安全和逆向系列教程 第19篇:ARM64汇编语言基础与逆向分析

引言 在成功掌握iOS应用脱壳技术后,我们获得了可以进行静态分析的二进制文件。然而,要真正理解iOS应用的底层逻辑,我们必须深入到汇编语言层面。ARM64(也称为AArch64)是苹果在iPhone 5s及以后设备中使用的指令集架构。本篇文章将深入探讨ARM64汇编语言的基础知识,并结合…

使用Gitlab CI/CD结合docker容器实现自动化部署

Gitlab CI/CD基本介绍 核心概念 持续集成&#xff08;CI&#xff09;&#xff1a;每次代码提交后自动触发构建、测试和代码检查&#xff0c;确保代码质量 持续交付/部署&#xff08;CD&#xff09;&#xff1a;在 CI 基础上自动将代码部署到测试或生产环境&#xff0c;支持人工…

初学者运行Pycharm程序可能会出现的问题,及解决办法

文章目录 前言一、ModuleNotFoundError: No module named sklearn二、ImportError: cannot import name show_config from numpy (unknown location)三、Pycharm报错&#xff1a;“Original error was: DLL load failed: 找不到指定的模块“ 的解决办法四、ImportError: cannot…