我有一个大的Qt +第三方库项目,我尝试将其编译成二进制文件,以便在另一台机器上测试程序。我能够使二进制运行(找到所有必要的*.dll
和插件(,但是,我无法弄清楚如何为我的程序包含带有图标的*.qrc
数据。目前,二进制文件无法加载任何图标,所以我只有带有文本的按钮。
我的程序的代码结构如下:
-
root_folder
-
CMakeLists.txt
-
program_folder
-
main.cpp
-
CMakeLists.txt
-
data_folder/
Data.qrc
和svg
格式的图标集 - 其他
.cpp
和.h
文件
-
- lib_folder1
- lib_folder2
- 。
-
这是Data.qrc
文件内部的外观:
RCC>
<qresource prefix="/">
<file>file-name.svg</file>
...
这是我在program_folder CMakeLists.txt
内将资源添加到程序中的方式:
qt5_add_resources(IMG_RSC_ADDED data_folder/Data.qrc )
add_executable(${PROJECT_NAME} ${PROJECT_SRCS} ${IMG_RSC_ADDED} )
在program_folder .cpp
文件之一中,我加载了图标:
static QIcon icon(QPixmap(":/file-name.svg"));
对于图标,我有一个class Data{};
,在该类中我有一组方法,例如static const QIcon& fileIcon();
.而在主代码中,当我需要使用图标时,我这样称呼它:Data::fileIcon()
.
当我从源代码编译和运行时,它可以工作。
我准备了我的程序的二进制分发,它是如何在某个根文件夹中构建的:
- 图像格式
-
qsvg.dll
-
- 平台
-
qwindows.dll
-
-
my_program.exe
-
Qt5Core.dll
- 其他Qt和第三方库
dll
我的问题是我如何以及在哪里放置数据文件?我尝试了不同的位置,例如,在主文件夹内,在创建的Data
文件夹中。我只是复制了我拥有的所有数据(svg
文件,qrc
文件(,但二进制文件仍然看不到资源。如何解决?或者,常见的做法是什么?
请注意,我正在使用CMake(不是QMake(来编译我的二进制文件。我在Windows 7上使用Qt-5.4。如果我的问题缺少详细信息,请告诉我,我会添加它们。谢谢!
>以下命令qt5_add_resources(IMG_RSC_ADDED data_folder/Data.qrc)
使具有二进制数据的源文件从提供的 qrc 文件(在本例中为 Data.qrc(的每个资源生成,并且结果文件的列表存储在 IMG_RSC_ADDED
变量中。如果将此变量传递给add_executable
则所有资源都将嵌入到生成的二进制文件中。
接下来,进入实际问题:问题不在于发行版,而在于代码本身。您在静态上下文中创建和初始化QIcon
并为其使用 QPixmap
但QPixmap
需要启动和运行QApplication
而静态初始化上下文并非如此。所以正确的解决方法是将QIcon
的初始化移动到某个本地上下文(如类 ctor 或 main 函数(