Qt中的RCC
Qt资源系统(Qt resource system)是一种独立于平台的机制,用于在应用程序中传输资源文件。如果你的应用程序始终需要一组特定的文件(例如图标、翻译文件和图片),并且你不想使用特定于系统的方式来打包和定位这些资源,则可以使用Qt资源系统。
最常见的情况是,资源文件嵌入到应用程序可执行文件中,或者嵌入到应用程序可执行文件加载的库和插件中。或者,资源文件也可以存储在外部资源文件中。
资源系统基于Qt的rcc资源编译器(Resource Compiler)、构建系统和Qt运行时API之间的紧密合作。
注意:目前,Qt资源系统尚未利用任何系统特定的资源处理功能,例如Windows、macOS和iOS上的资源处理功能。这种情况可能会在未来的Qt版本中得到改变。
Qt Resource Compiler(rcc):
(1).rcc命令行工具:用于在构建过程中将资源嵌入到Qt应用程序中,读取资源文件并生成C++或Python源文件,或者生成.rcc文件。rcc.exe位于6.8.0\msvc2019_64\bin,其支持的输入参数如下所示:
(2).文件列表和相关元数据(metadata)以Qt资源集合文件(Qt Resource Collection File)的形式传递给rcc。
(3).默认情况下,rcc会生成C++源代码,然后将其编译为可执行文件或库的一部分。"-g python"选项会生成Python源代码。"-binary"选项会生成一个二进制存档,按照惯例,该存档会保存在.rcc文件中,并可在运行时加载。
(4).注意:虽然可以从命令行运行rcc,但通常最好将其留给构建系统。
Qt Resource Collection File(.qrc):
(1)..qrc文件是一个XML文档,其中列举了需要作为运行时资源包含的本地文件。它作为rcc的输入。mainwindow.qrc文件内容示例如下:在vs2022中此文件可以直接使用Qt Resource Editor打开
(2).XML中的每个<file>元素都标识应用程序源代码树中的一个文件。路径是相对于包含.qrc文件的目录解析的。
(3).默认情况下,该路径也用于在运行时标识文件的内容。
(4).Qt Creator、Qt Design Studio、Qt Widgets Designer和Qt Visual Studio Tools允许你通过便捷的用户界面创建、检查和编辑.qrc文件。除了Qt Widgets Designer之外,它们还为使用Qt资源系统的项目提供了向导。
构建系统集成:
(1).使用rcc处理资源文件通常在应用程序构建时完成。一些构建工具对此提供了专门的支持,包括CMake和qmake。
(2).如果启用了CMAKE_AUTORCC,你只需将.qrc文件作为源添加到可执行文件或库中即可。引用的资源文件将嵌入到二进制文件中:set(CMAKE_AUTORCC ON)
(3).AUTORCC的替代方案是使用Qt6Core的CMake函数qt_add_resources,该函数可以更好地控制资源的创建。例如,它允许你直接在项目文件中指定资源的内容,而无需先编写.qrc文件:调用qt_add_resources后会由mainwindow.qrc生成qrc_mainwindow.cpp,内容示例如下:
Runtime API:
处理迭代和读取文件的Qt API内置了对Qt资源系统的支持。你可以将资源路径(而不是本地文件路径)传递给QFile和QDir,也可以传递给QIcon、QImage和QPixmap等构造函数,如下所示:":"前缀明确表示应从Qt资源系统加载"/images/cut.png"
cutAct = new QAction(QIcon(":/images/cut.png"), tr("Cu&t"), this);
高级主题:
(1).前缀:.qrc文件可以设置一个前缀,该前缀将添加到<file>元素中指定的每个本地文件名之后,用于获取资源系统中该文件的名称。前缀允许你构建资源结构,避免通过不同库或插件中的不同.qrc文件添加的资源文件之间发生冲突。
(2).别名:有时,将资源文件在运行时置于其他路径下会很方便。.qrc文件可以通过设置alias属性来实现。
(3).丢弃文件内容:有时你想将文件节点添加到资源文件系统,但实际上并不想添加文件内容。.qrc文件通过将empty属性设置为true来实现此目的。生成的文件仍然可以从应用程序访问,但其内容为空。这对于从应用程序二进制文件中剥离QML源代码非常有用。
(4).语言选择器:某些资源需要根据用户的语言环境进行更改,例如翻译文件或图标。资源集合文件通过为qresource标签添加lang属性来支持此功能,该属性指定了合适的语言环境字符串。
(5).嵌入大文件:默认情况下,rcc会将资源文件以C++数组的形式嵌入到可执行文件中。这对于大型资源尤其容易出现问题。如果编译器运行时间过长,甚至由于内存溢出而失败,你可以选择一种特殊模式,在该模式下,资源将通过两步过程嵌入。C++编译器只会在目标可执行文件或库中为资源预留足够的空间。资源文件内容和元数据的实际嵌入是在编译和链接阶段之后,通过另一个rcc调用完成的。对于CMake,你需要使用qt_add_big_resources函数。
(6).外部资源文件:除了将资源文件嵌入二进制文件之外,还可以将它们存储在单独的.rcc文件中。rcc允许使用"-binary"选项来实现此目的。此类.rcc文件必须在运行时使用QResource加载。对应CMake,可以使用qt_add_binary_resources函数。
(7).压缩:rcc会尝试压缩内容,以优化最终二进制文件中的磁盘空间使用率。如果需要,可以关闭压缩功能。
GitHub:https://github.com/fengbingchun/Qt_Test