0、前言(必看)
打包QT项目,分为下面的1,2两步骤,第二步打包步骤需要参考我给出的博客(已经十分详细),普通的打包项目(没有调用模型、不需要进一步打包成安装包)参考1,2即可。
如果你的项目中用到了一些资源(比如调用了模型),则你需要参考第二部分的补充细节进行添加你所用到的模型。
通过1,2两个步骤,你得到了一个整个软件的运行目录,把这个目录拿过去,点击目录中的.exe
可执行文件,在符合软件所要求的硬件标准的机器上都能运行。
但是如果你想进一步以一个安装包发给对方,那么你就需要参考第三步骤,将这个目录打包成一个安装包。
1、添加图标
参考教程:VS+Qt应用开发-设置软件图标
2、打包
整个打包过程参考:https://blog.csdn.net/qq_37366618/article/details/126604968
下面是一些补充细节:
一、涉及到模型or图片等程序需要用到的资源
当你打包一个Qt的C++项目时,涉及到资源文件(如模型文件)的管理,你需要考虑以下几点:
- 资源文件的位置:通常,你应该在项目中创建一个特定的目录来存储这些资源文件。例如,你可以创建一个名为resources或models的文件夹,在这个文件夹中存放你的模型文件。
- 在代码中使用相对路径:使用相对路径是一个好主意,这样当你的应用程序被安装到用户的系统上时,它仍然能够找到这些资源文件。Qt提供了QDir和QCoreApplication类,可以帮助你构建相对于你的应用程序可执行文件的路径。
- 资源文件的访问:在Qt中,有一个非常方便的资源系统(The Qt Resource System),允许你将文件编译到你的应用程序中。通过.qrc文件,你可以定义一组资源文件,并在代码中使用
:/
”前缀来访问这些文件。
根据你的需求,这里有两种方式来处理模型文件:
1、使用Qt资源系统(推荐用于小到中等大小的资源文件):
- 在你的项目中创建一个.qrc文件。
- 在这个.qrc文件中添加你的模型文件。
- 在代码中使用由资源系统定义的路径(例如使用:path/to/model.file)。
例如,在.qrc文件中:
<RCC>
<qresource prefix="/">
<file>models/myModel.model</file>
</qresource>
</RCC>
在C++代码中:
QString modelPath = ":/models/myModel.model";
注意这样还是不能直接使用!!!
我现在.qrc文件中内容如下,我该如何在qt项目中使用呢?
<qresource prefix="/new_QT_python">
<file>models/best.trt</file>
<file>models/pump_best.onnx</file>
<file>photo/example.jpg</file>
</qresource>
</RCC>
在Qt项目中,一旦你定义了.qrc文件并且正确地设置了资源,你就可以通过资源路径来访问这些文件。资源路径通常以冒号(:)开头,后跟你在.qrc文件中设置的前缀和文件路径。
假设你的.qrc文件已经添加到项目中,并且项目已经重新编译,你可以按如下方式访问资源:
- 在Qt中加载模型文件:
如果你想加载模型文件(例如.onnx或.trt文件),你可能需要将文件读取到内存中,然后使用模型加载库(例如用于加载ONNX模型的库)来处理它。对于不支持Qt资源路径的库,你通常需要先将资源写入到临时文件中。
例如,将ONNX模型从资源复制到临时文件,并返回临时文件的路径:
QString getTempModelFilePath(const QString& resourcePath) {
QFile resFile(resourcePath);
if (resFile.open(QIODevice::ReadOnly)) {
// 创建临时文件
QTemporaryFile tempFile;
if (tempFile.open()) {
tempFile.write(resFile.readAll());
tempFile.close();
return tempFile.fileName(); // 返回临时文件路径
}
}
return QString(); // 返回一个空字符串,表示失败
}
// 使用函数获取模型文件路径
QString modelPath = getTempModelFilePath(":/new_QT_python/models/pump_best.onnx");
- 在Qt中加载图像文件:
要在Qt中加载图像文件,你可以直接使用QImage或QPixmap类。这些类理解Qt资源系统的路径。例如,加载一个图像到QPixmap对象中:
cpp
QPixmap pixmap(":/new_QT_python/photo/example.jpg");
if (!pixmap.isNull()) {
// 成功加载了图像,可以在Qt中使用pixmap对象
}
如果你需要将图像转换为OpenCV的格式,你可以使用前面提到的QImageToCvMat函数来将QImage转换为cv::Mat,就像我们先前提到的那样。
请注意,使用资源文件时,你应该确保资源文件是通过Qt的构建过程嵌入到应用程序中。这通常意味着你需要在Qt Creator中添加资源文件,并确保它在构建过程中被编译。如果你所做的更改没有反映在应用程序中,可能需要重新构建项目。
2、 使用文件系统(推荐用于大型资源文件或者如果你想要资源文件在安装后可编辑):
- 在你的项目文件夹中创建一个models文件夹,并将模型文件放入其中。
- 在代码中,使用相对路径来访问这些文件,你可以使用QCoreApplication::applicationDirPath()来获取你的应用程序目录的路径,然后构建到模型文件的路径。
例如,在C++代码中:
QString appDir = QCoreApplication::applicationDirPath();
QString modelPath = appDir + "/models/myModel.model";
注意:当你发布应用程序时,确保你的安装程序也包括了这些资源文件,并且将它们放在正确的位置(可执行文件.exe
文件下)。
选择哪种方式取决于你的具体需求和资源文件的大小。对于大型文件或者需要更新的
文件,使用文件系统可能更合适。对于小型且不常变更的资源,使用Qt的资源系统可能更方便。
3、打包成一个 exe 安装包
经过第二步,就可以将整个文件夹发布出去了,但如果想打包成一个 exe 安装包,就要进行下面的步骤了。
Inno Setup 是一个免费的 Windows 安装程序制作软件,小巧、简便、精美是其最大特点,支持 pascal 脚本,能快速制作出标准 Windows2000 风格的安装界面,足以完成一般安装任务。
官方下载地址:http://www.jrsoftware.org/isdl.php#stable
下载后直接安装即可。
项目开发完成之后,需要打包程序发行,可以使用 Inno Setup 软件制作安装 exe。以下详细讲解如何打包应用程序:
1)打开 Inno Setup Complier,点击 【file】→【new】,新建一个脚本向导程序,然后点击【next】;
(2)在应用程序信息中输入 “应用程序名称”、“应用程序版本”、“应用程序发布者”、“应用程序网站”,这些信息会自动在脚本中生成,然后点击下一步;
(3)自定义打包文件的的输出地址以及输出文件夹的名称,然后点击下一步;
(4)选择应用程序的主执行文件,也就是你编译生成的 exe 文件,下面点击 “Add folder ”,把所有你的程序运行需要的 dll 和资源以及配置文件放在一个文件夹里,选择这个文件夹,然后点击下一步;
注:Add folder 添加 .exe 的父文件夹,将依赖的 dll 等文件全部包含在内。
(5)输入应用程序在开始菜单中显示的名字,需要哪些功能,在前边打上对勾,一般默认即可,然后点击下一步;
6)这里可以选择 “许可文件”,“安装前的文件”(如 Readme 文件等),“安装后显示信息” 等,然后点击下一步;
(7)安装模式:
(8)选择 “安装语言”,然后点击下一步;
(9)选择 “自定义编译器输出文件夹”、“编译器输出基本文件名”、“自定义的安装程序图标文件”及“安装密码”,然后点击下一步;
注:第一个选项表示的是生成的 安装包*.exe 的输出目录。icon文件是 安装包*.exe 的图标文件。
(10)在这里选择是否使用 #define 编译指令,选择 yes 也就是在生成的脚本里使用 #define 宏定义一些常量,方便脚本编写,勾不勾选随意,然后点击下一步;
最后一步中间会询问你是否立即编译新的脚本,这个脚本是根据刚才我们前面填写的那些内容自动生成的。可以直接使用编译,也可以自己重新编写,下面贴出生成的脚本代码。
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "风电塔筒螺母智能监测系统"
#define MyAppVersion "1.5"
#define MyAppPublisher "yaoyao2024"
#define MyAppExeName "NDS.exe"
#define MyAppAssocName MyAppName + "v1.5"
#define MyAppAssocExt ".myp"
#define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt
[Setup]
; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{F0F6FED7-02FB-4EE7-BDF7-CAECC96AB171}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
DefaultDirName=D:/NDS
ChangesAssociations=yes
DisableProgramGroupPage=yes
; Remove the following line to run in administrative install mode (install for all users.)
PrivilegesRequired=lowest
OutputDir=E:\app
OutputBaseFilename=NDS_v1.5
SetupIconFile=D:\CollegeStudy\AI\windElectProject\VS2019_cpp\new_QT_python\new_QT_python\resource\alan3-hx5u9-001.ico
Compression=lzma
SolidCompression=yes
WizardStyle=modern
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
Source: "E:\app\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
Source: "E:\app\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Registry]
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocExt}\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocKey}"; ValueData: ""; Flags: uninsdeletevalue
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}"; ValueType: string; ValueName: ""; ValueData: "{#MyAppAssocName}"; Flags: uninsdeletekey
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0"
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1"""
Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".myp"; ValueData: ""
[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
- 运行过程中出现错误,可以直接在脚本中进行修改。
- 如果要打包出新版本的 exe 安装包文件,不需要再将上面流程走一遍,只需要将原先的 exe 可执行文件替换掉,再打开原先生成的脚本文件运行,即可生成新版本的 exe 安装包文件。
OK成功!