如何将 qrc 数据包含在使用 CMake 编译的基于 Qt 的二进制文件中



我有一个大的Qt +第三方库项目,我尝试将其编译成二进制文件,以便在另一台机器上测试程序。我能够使二进制运行(找到所有必要的*.dll和插件(,但是,我无法弄清楚如何为我的程序包含带有图标的*.qrc数据。目前,二进制文件无法加载任何图标,所以我只有带有文本的按钮。

我的程序的代码结构如下:

  • root_folder
    • CMakeLists.txt
    • program_folder
      • main.cpp
      • CMakeLists.txt
      • data_folder/Data.qrcsvg格式的图标集
      • 其他.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并为其使用 QPixmapQPixmap需要启动和运行QApplication而静态初始化上下文并非如此。所以正确的解决方法是将QIcon的初始化移动到某个本地上下文(如类 ctor 或 main 函数(

最新更新