如何将qrc数据包含到使用CMake

时间:2016-02-05 17:14:32

标签: c++ qt binary cmake qt5

我有一个很大的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()

当我从源代码编译和运行时,它可以工作。

我准备了我的程序的二进制发行版,以及它在一些根文件夹中的结构:

  • imageformats
    • qsvg.dll
  • 平台
    • qwindows.dll
  • my_program.exe
  • Qt5Core.dll
  • 其他Qt和第三方-lib dll s

我的问题是我如何以及在何处放置数据文件?我在创建的Data文件夹中尝试了不同的位置,例如,在主文件夹内。我只是复制了我拥有的所有数据(svg文件,qrc文件),但二进制文件仍然无法查看资源。怎么解决?或者,通常的做法是什么?

注意,我使用CMake(而不是QMake)来编译我的二进制文件。我在Windows 7上使用Qt-5.4。如果我的问题缺乏细节,请告诉我,我会添加它们。谢谢!

1 个答案:

答案 0 :(得分:1)

以下命令qt5_add_resources(IMG_RSC_ADDED data_folder/Data.qrc)使得来自所提供的qrc文件(在本例中为Data.qrc)的每个资源生成具有二进制数据的源文件,并且所得文件的列表存储在IMG_RSC_ADDED中变量。如果将此变量传递给add_executable,则所有资源都嵌入到生成的二进制文件中。

接下来,针对实际问题:问题不在于分发,而在于代码本身。您在静态上下文中创建并初始化QIcon并使用QPixmapQPixmap需要QApplication启动并运行,这与静态初始化上下文不同。所以正确的解决方法是将QIcon的初始化移动到某个本地上下文(如类ctor或main函数)