VS2019下打包QT项目的方法(包含第三方库)、打包成一个 exe 安装包

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++项目时,涉及到资源文件(如模型文件)的管理,你需要考虑以下几点:

  1. 资源文件的位置:通常,你应该在项目中创建一个特定的目录来存储这些资源文件。例如,你可以创建一个名为resources或models的文件夹,在这个文件夹中存放你的模型文件。
  2. 在代码中使用相对路径:使用相对路径是一个好主意,这样当你的应用程序被安装到用户的系统上时,它仍然能够找到这些资源文件。Qt提供了QDir和QCoreApplication类,可以帮助你构建相对于你的应用程序可执行文件的路径。
  3. 资源文件的访问:在Qt中,有一个非常方便的资源系统(The Qt Resource System),允许你将文件编译到你的应用程序中。通过.qrc文件,你可以定义一组资源文件,并在代码中使用:/”前缀来访问这些文件。

根据你的需求,这里有两种方式来处理模型文件:

1、使用Qt资源系统(推荐用于小到中等大小的资源文件):

  1. 在你的项目中创建一个.qrc文件。
  2. 在这个.qrc文件中添加你的模型文件。
  3. 在代码中使用由资源系统定义的路径(例如使用: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、 使用文件系统(推荐用于大型资源文件或者如果你想要资源文件在安装后可编辑):

  1. 在你的项目文件夹中创建一个models文件夹,并将模型文件放入其中。
  2. 在代码中,使用相对路径来访问这些文件,你可以使用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成功!
在这里插入图片描述

  • 18
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在使用Qt开发桌面应用程序时,我们可能会遇到需要将第三方应用程序嵌入到我们的程序中的情况,这时就需要进行一些相关的配置和操作。常见的第三方应用程序包括浏览器、视频播放器、PDF阅读器等。 一般来说,我们可以使用Qt的QProcess类来启动第三方应用程序,然后将其嵌入到我们的程序中。同时,为了实现良好的用户体验,我们还需要对嵌入的应用程序进行一些界面以及交互上的调整和配置。 需要注意的是,嵌入第三方应用程序可能会带来性能和安全上的方面问题,因此在进行操作时需要格外小心并进行充分的测试。此外,对于某些操作系统和平台,可能会存在一些限制或者需要特殊的配置和处理方式,这也需要我们进行深入的研究和了解。 总之,Qt提供了丰富的API和工具,使得我们可以比较容易地实现第三方应用程序的嵌入和定制化。在具体实现过程中,需要根据具体情况进行合理的配置和调整,以实现最佳的效果和用户体验。 ### 回答2: 在Qt中,嵌入第三方应用exe可以通过QProcess类来实现。首先,需要创建一个QProcess对象,并使用它来执行要嵌入的第三方应用exe。其次,需要显示第三方应用的窗口,并将其添加到Qt应用程序的窗体中。这可以使用QWidget的QWidget::createWindowContainer()方法来实现,该方法可以将一个QWidget作为另一个QWidget的子控件,并将其嵌入到其父QWidget中。最后,需要将第三方应用的输入和输出与QProcess对象的输入和输出进行连接,以便能够与其进行交互。 但是需要注意的是,Qt应用程序和第三方应用的所使用的共享库必须是兼容的,否则可能会导致崩溃或者其他问题。此外,也可能会遇到中文乱码等问题,需要根据实际情况进行处理。 ### 回答3: Qt一个跨平台的应用程序开发框架,可以轻松地开发各种类型的应用程序,包括图形用户界面应用、嵌入式软件、网络应用、数据库应用和游戏等。在 Qt 中,开发者可以通过使用 QProcess 类,来启动和控制外部应用程序,包括第三方应用程序。对于需要嵌入第三方应用程序的情况,一般需要借助使用一些特殊的工具和技术来实现。 在嵌入第三方应用程序到 Qt 应用程序中时,需要将第三方应用程序打包 DLL 或者直接生可执行文件。在 Qt 应用程序中,可以使用 QLibrary 类来加载和调用 DLL 并完嵌入。如果第三方应用程序是一个可执行文件,需要在 Qt 应用程序中使用 QProcess 类启动该应用程序,并设置相关参数、环境变量和路径等信息。启动后,需要使用 QWidget 的子类来创建一个嵌入窗口,并使用 QWinWidget 类将嵌入窗口与 QProcess 类中启动的应用程序进行连接,使第三方应用程序可以显示在 Qt 程序中的指定区域,并接收输入事件和操作。 在使用 Qt 嵌入第三方应用程序时,需要注意一些问题,如应用程序的兼容性、界面的集、窗口之间的交互等。同时,还需要考虑到不同平台之间的差异性,例如 Windows 和 Linux 系统下嵌入第三方应用程序的方法和实现方式可能会有所不同。因此,在实际开发中,根据具体情况,需要采用适当的技术和工具来实现嵌入第三方应用程序的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是瑶瑶子啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值