【C++/Qt/NSIS】软件打包与自定义安装包制作

2023-10-28

        上一篇文章中我们完成了一个点灯的益智小游戏(童年益智小游戏-点灯),今天我们来尝试将它打包并制作一个安装包。效果如下:

         首先将我们的工程打包,在上一篇文章中我们建立并完成了小游戏的VS工程,现在首先来生成一下Release版本的可执行文件,并将它拷贝到一个文件夹中。

        我们的图标和logo资源已经在程序中进行了加载,所以不需要做任何操作,但是请注意,如果软件资源较多并且后续可能需要更换资源的话,这种方式需要修改程序重新生成可执行文件,比较复杂,可以考虑使用动态加载资源的方式,参考:Qt动态加载资源_qt 加载资源_贝勒里恩的博客-CSDN博客

        接下来我们需要将用到的基础Qt链接库放在这个目录下(如果是别的软件用了其它Qt库也都需要拷贝过来),可以在(...\Qt\Qt5.15.2\5.15.2\msvc2019_64\bin)这个路径下找到

        为了防止出现找不到Qt平台的报错,我们还需要把Qt插件文件夹中的platform文件夹拷贝过来,为了我们的软件能够正常加载除了基础图片格式png以外的其它图片格式(比如我们的logo是一个gif),还需要拷贝同路径下的imageformats文件夹。

        点击exe文件测试我们的软件使用正常,资源加载也正常,至此打包步骤完成。值得一提,除了上述的手动打包方式,也可以使用 windeployqt命令,即在qt自带的命令窗

中, 使用 windeployqt xxx.exe的方式进行自动打包,但也有一些坑,具体的各位读者可以自行搜索。

         至此打包过程结束,接下来我们尝试将软件制作为安装包。

        首先下载NSIS-UI-Plugin-master第三方库,GitHub地址:GitHub - sway913/NSIS-UI-Plugin: Create NSIS Modern UI Setup by Using Thirdparty UI Library(such as Qt, DuiLib)https://github.com/sway913/NSIS-UI-Plugin        读者可先自行阅读里面的readme文件,使用步骤都在里面,要注意的点笔者会在下面依次列出。

        首先下载NSIS软件并安装,添加环境变量NSIS_DIR为NSIS安装目录,这一步没有什么注意点,随着NSIS软件一起下载的可视化界面也可以实现简单的安装包制作,但是没有自定义风格的功能,这里我们只借助它的库即可。

        打开上面通过GitHub下载的NSIS-UI-Plugin-master工程,切换平台为x86

         貌似是官方还不支持x64版本,总之不用管,x86调通之后肯定能用。

        在编译工程之前我们还需要在这个工程内部修改安装界面为我们喜欢的风格:

MainPage.ui文件为我们安装包的显示界面,我们可以在上面修改增删控件

        main.css中可以加载我们自己的资源,语法是css,但是这里用到的都比较简单 ,资源文件放在NSIS-UI-Plugin-master\NSIS-UI-Plugin\Resources目录下即可,我们这里是单独放在DefaultTheme文件夹下。此外也可以修改工程本身的资源文件,方式和我们上一篇文章中所述一致。

 

        以上是控件和资源相关的内容,功能上我们也可以做一些小的修改,增加代码鲁棒性,比如不勾选同意协议的话我们就将开始安装的按钮改为灰色风格并无法进行下一步安装。

        此外注意,我们安装时生成的卸载脚本uninst.exe,会将它所在路径下的文件全部删除,所以一定要保证用户将软件安装在一个空路径下才能提供下一步的安装(或者自动创建空文件夹往里面安装也是一种思路,这里笔者用的是前者方法)。

        再比如将首页的用户许可协议几个字设为超链接,点击后直接打开尾页的用户许可协议,并可以使用户阅读完后返回首页。

 

         诸如此类可开发的功能还有很多,留给读者慢慢探索。

        至此我们已经修改完了安装包界面相关的内容,除了上述提到的文件外,其它文件建议不做任何修改,直接生成工程,Debug或Release均可,推荐Release。但如上文所述,一定要选择x86平台,因为官方(目前为止)只支持32位。

        生成解决方案成功后会在NSIS-UI-Plugin-master\NSIS-UI-Plugin\Win32\路径下生成对应的NSIS-UI-Plugin.dll

        如果生成失败报错了,但仍然在上述路径下生成了该文件,则说明是前面的NSIS环境变量设置有问题,此时可以手动将该文件拷贝到:NSIS安装路径\Plugins\x86-unicode

 的位置,并改名,如下图所示(注意文件大小和修改日期,其实就是上面那个文件,如果环境变量添加正确,这一步会自动完成)

        有了NSIS插件下的这个文件,我们后续使用打包脚本就可以直接调用使用它了,不过在此之前我们还需要提供一个python环境,保证能够运行NSIS-UI-Plugin-master路径下的NsisScriptGenerate.py文件,任意一个python环境只要能跑起来都可以,不用新建一个环境,要注意该文件默认使用python2写的,如果你的python环境是python3,那么需要将该文件中的所有print函数修改为python3的格式。

        完成了以上工作后,就只剩最后一步了,请读者坚持一下,马上就可以看到我们自己的安装包了。我们来到NSIS-UI-Plugin-master\VimeoSetup路径下,可以看到vimeo.nsi和vimeo-template.nsi两个脚本文件,其中vimeo.nsi是NSIS自带的原始脚本,vimeo-template.nsi是根据vimeo.nsi生成的一个例程,我们需要修改后者,打开vimeo-template.nsi文件,

开头的几个宏定义都是我们需要修改的,分别对应了 安装后软件的名字、快捷方式对应的可执行文件、可执行文件和卸载脚本的图标等。这个脚本中其它内容的作用及NSIS脚本的语法知识可以参考网上的教程,比如这个系列NSIS介绍_51CTO博客_nsis

         注意上述脚本中填写的exe路径是以安装后的路径下为基准的,比如你可以把exe文件放在一个bin文件夹下,也可以像我这样直接放在安装根目录下,上述的对应位置都要作修改,另外相应的图标ico文件也需要读者自己去制作(网上有在线的图片转ico工具)。

        接下来我们就可以直接运行该路径下的build-setup.bat脚本(默认使用release版本,另一个带debug的bat文件对应的是debug版本),开始制作安装包了,打开NSIS脚本如下图后,如果最终如下图所示只有警告没有报错,那么恭喜你,已经成功制作了安装包。

        如果这个界面出现了报错,或者生成的安装包点击闪退,就说明前面的步骤存在错误,比如

 QT的环境变量没有添加正确,或者没有使用32位平台生成NSIS-UI-Plugin的链接库。具体可以NSIS脚本界面中的报错信息来判断。

 

        最终我们就成功制作了上一篇文章中写的小游戏的安装包并完成了安装,打开安装的目录,内容如下:

 

        注意这里的可执行文件LightGame.exe没有图标不是安装包的问题,是我们在原Qt工程里本身就没有为可执行文件加载图标(上一篇文章忘了加这一步= - =),读者可以自行搜索如何为可执行文件添加图标,方法非常简单。

        感谢各位读者看到这里,我们下一篇文章再见。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++/Qt/NSIS】软件打包与自定义安装包制作 的相关文章

  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 自定义字体有时在 IE8 / IE7 中以斜体呈现

    在 IE7 和 IE8 中 当使用自定义 Web 字体时 文本有时会以斜体呈现 即使我明确设置font style normal 这个问题是偶发的 它会渲染几次 然后我刷新 一切都是斜体 然后我刷新 它恢复正常 我正在用这个 font fa
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 禁用 iframe 中的滚动

    有没有办法在 iframe 中禁用所有滚动 我有一个 iframe 其中内容超出了 iframe 尺寸 设置scrolling no 只会删除滚动条 但不会禁用滚动 我无法控制 iframe html 的头部 所以我无法设计它的样式 有任何
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • HTML 布局:向现有网站添加侧边栏

    我有一个网站 其正文如下所示 div div div div div div 这些中没有使用绝对 相对定位技巧divs 但是有很多floats clears margins and padding这些风格divs 及其内部元素 所有这些都会
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • CSS交付优化:如何推迟CSS加载?

    我在尝试着优化 CSS 交付遵循针对开发人员的谷歌文档https developers google com speed docs insights OptimizeCSSDelivery example https developers
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • CSS3 背景渐变未验证,有人可以告诉我为什么吗?里面的代码示例

    有人能告诉我为什么下面的 css 没有验证吗 我一直在尝试自己研究这个问题 但没有运气 我读过的所有文档都说这是在 css3 中进行渐变的正确原因 header color white font size 12px font family
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组

    300 最长递增子序列 给你一个整数数组 nums 找到其中最长严格递增子序列的长度 子序列 是由数组派生而来的序列 删除 或不删除 数组中的元素而不改变其余元素的顺序 例如 3 6 2 7 是数组 0 3 1 6 2 2 7 的子序列 示
  • Vue3实现页面缓存,切换tab页面保持不变

    实现该部分主要分为两个步骤 首先是在index js中 将跳转的路由设置如下 path control name Control component gt import page Control vue meta keepAlive tru
  • 细说Spring——IoC详解(XML配置一)

    在我们经过了 细说Spring IoC详解 一 细说Spring IoC详解 二 细说Spring IoC详解 三 的学习之后 已经对Spring的Ioc容器有了一定的了解 我们队容器如何创建对象有了细致的了解 接下来就是一些其他零零散散的
  • spring boot 2 使用 actuator 404的问题

    按照 actuator 的使用方法 项目中添加下面的依赖
  • HTML基础

    HTML基础 网页 常用浏览器 WEB标准 HTML语法规范 HTML基本结构标签 骨架标签 网页 html hyper text markup language 超文本标记语言 常用浏览器 IE 火狐 谷歌 主要使用 Safari Ope
  • day4作业

    思维导图 https mubu com app edit home 4o103CemUMn m 九九乘法表
  • Quorum Journal Manager原理

    Quorum Journal Manager原理 在一个典型的HA集群 两个独立的物理节点配置为NameNodes 在任何时间点 其中之一NameNodes是处于Active状态 另一种是在Standby状态 Active NameNode
  • 在gitee上建自己的博客

    在gitee上建自己的博客 一 安装git插件 二 安装node 三 安装hexo 1 输入命令 npm install g hexo cli 2 验证安装是否成功 四 博客初始化 1 新建一个文件夹 从这里面进入git bash 右击 输
  • 内存分配原理以及malloc的实现

    原文 http m blog csdn net article details id 39496057 原文 https blog csdn net Damage233 article details 81116115 目录 内存分配的原理
  • linux java 安装包下载,linux系统安装jdk1.7(压缩包)

    一 前言 java中想要将项目部署到linux系统的服务器上就免不了要安装jdk linux上安装jdk主要有两种方式 一种是rpm格式安装 另一种是压缩包安装 我下面介绍后者的安装方法安装jdk1 7 二 下载jdk 7u80 linux
  • blob是什么类型?

    BLOB binary large object 二进制大对象 是一个可以存储二进制文件的容器 在计算机中 BLOB常常是数据库中用来存储二进制文件的字段类型 BLOB是一个大文件 典型的BLOB是一张图片或一个声音文件 由于它们的尺寸 必
  • 超全vue指令全家桶

    在 Vue js 中 指令 Directive 是一种特殊的属性 它可以用于扩展 HTML 元素的行为 指令以 v 前缀作为标识符 用于标识当前属性是一个指令 数据绑定类指令 1 v text填充文本 v text 是 Vue js 内置指
  • 模型简化用边塌陷不行,应钻研下face clustering简化

    保持形状不变时 边塌陷算法是不尽人意的 osg中的simplifier默认用的是这种算法 所以 以后研究下face clustering简化
  • 天梯赛L1级别80道题解

    题目地址 天梯赛 1 include
  • 让服务器系统瘫痪,简单的方法 让棒子的服务器瘫痪 圣战的进来!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 行动方法 不需要任何工具 1 点开始 运行 输入 cmd 不带双引号 点确定 2 会弹出命令行的界面 输入 ping l 1024 superjunior smtown com t 不带双引号
  • 小朋友排队(树状数组求解逆序对 + 归并排序求解逆序对)

    小朋友排队问题 文章目录 小朋友排队问题 前言 知识预备 树状数组 归并排序求解逆序对 问题描述 问题分析 树状数组的解法 代码 树状数组版 归并排序解法 暴力条件下 线性条件下 代码 归并排序线性版 前言 对于树状数组 我们首先要明确树状
  • 桌面上的图标不能正常显示,但程序能运行

    这一般是系统图标缓存出现问题所致 可这样设置 按Ctrl Shift Esc打开任务管理器 在进程列表中找到explorer exe并将其结束 接下来在单击任务管理器菜单 文件 运行 输入 cmd 并回车打开命令提示符窗口 输入以下命令 C
  • java.sql.SQLFeatureNotSupportedException

    原因 mybatisplus和德鲁伊版本不兼容 Caused by java sql SQLFeatureNotSupportedException at com alibaba druid pool DruidPooledResultSe
  • Jmeter(二十九) - 从入门到精通 - Jmeter Http协议录制脚本工具-Badboy2(详解教程)

    1 简介 上一篇文中已经对Badboy做了一个基本上详细完整的介绍 这一篇带你们实战一下 这一篇主要讲解和分享 录制和运行脚本 参数化 首先让我们使用N模式录制一个脚本 测试用例编号为 2 1 1 成功的发布仅有文字主题 2录制脚本 1 创
  • 【C++/Qt/NSIS】软件打包与自定义安装包制作

    上一篇文章中我们完成了一个点灯的益智小游戏 童年益智小游戏 点灯 今天我们来尝试将它打包并制作一个安装包 效果如下 首先将我们的工程打包 在上一篇文章中我们建立并完成了小游戏的VS工程 现在首先来生成一下Release版本的可执行文件 并将