Qt 自带的开发工具集里有专门的 rcc 工具,用于将 *.qrc 里面描述的图片、文档等编译成对应的源代码文件 qrc_*.cpp 或者独立的二进制资源文件 *.rcc。下面介绍 rcc 工具的两种用途:

(1)生成独立的二进制资源文件 *.rcc
对于太大的图片、音频、视频等文件,不适合集成到目标程序内部,可以放到操作系统文件路径,或者单独编译成外挂资源 *.rcc 。举例来说,myresource.qrc 包含了很多图片和视频,没法编译成目标程序内嵌资源时,可以打开 Qt 命令行,进入 myresource.qrc 所在的文件夹,执行命令:

rcc -binary myresource.qrc -o myresource.rcc

rcc 会把 myresource.qrc 里面描述的所有图片、视频等文件,都压缩打包,生成一个二进制的 myresource.rcc 文件,这个 myresource.rcc 包含了所有的资源,这样程序发布时就不需要带一堆乱七八糟的碎文件了,一个 myresource.rcc 搞定。

那么代码中如何使用 myresource.rcc 呢?需要在 main 函数开始的位置注册这个独立的二进制资源文件:

QResource::registerResource("/path/to/myresource.rcc");

然后也是使用之前类似的虚拟文件路径,比如 ":/images/copy.png" 、":/images/cat.gif" 。
二进制资源文件 *.rcc 是用于外挂的,其实应用程序里面更常见的是内嵌资源,接下来介绍内嵌使用方式。

(2)应用程序内嵌资源
如果希望一个资源描述文件 application.qrc 在程序编译时内嵌到目标程序里,需要在 *.pro 文件里加一句话:

RESOURCES += application.qrc

qmake 会自动根据这句话,为 application.qrc 添加编译脚本,其编译过程如下图所示:

rcc 工具会解析 application.qrc 内的 XML 文本,找到需要添加的各种文件,默认情况下,rcc 工具会对这些文件做 ZIP 压缩,然后将压缩后的 ZIP 数据的每个字节转换成比如 0x6f, 数值形式,所有文件压缩后的数据对应一个 C++ 静态数组 qt_resource_data[] ,并添加注册、取消注册、初始化、清除等函数和资源描述结构体,最终形成一个 qrc_application.cpp 文件。然后用编译器编译 qrc_application.cpp文件,得到 qrc_applicaotion.o ,链接到目标程序内部,就可以用 ":/images/copy.png" 等形式访问程序内嵌资源了。

注意到刚才向 *.pro 文件里添加 qrc 资源描述文件使用的运算符是 +=  ,也就是说可以为应用程序添加多个 *.qrc 文件,如果涉及的图片比较多,可以用多个 *.qrc 对图片分类存放:

RESOURCES += buttons.qrc 
RESOURCES += backgrounds.qrc

使用多个 *.qrc 与使用一个 *.qrc 的方式是一样的,虚拟文件路径都类似 ":/buttons/ok.png" 、":/backgrounds/bgmain.png" 等,这里的 ok.png 放在项目文件夹的 buttons 子文件夹里,而 bgmain.png 是放在项目文件夹的 backgrounds 子文件夹里,因此两个文件的路径是不同的。

qmake 为内嵌资源添加的 rcc 编译命令,类似下面这样:

rcc -name application  application.qrc -o qrc_application.cpp

得到 qrc_application.cpp 源文件之后,剩下的编译、链接就与普通 .cpp 文件一模一样了。

qrc_application.cpp 文件中不仅有各种图片、文档对应的静态数组,还有些结构体和函数,比如初始化和清除函数。
对于 rcc 命令,如果不加 -name application  选项参数,那么在 qrc_application.cpp 里面生成的初始化和清除函数名为:

int QT_RCC_MANGLE_NAMESPACE(qInitResources)();
int QT_RCC_MANGLE_NAMESPACE(qCleanupResources)();

如果加了 -name application  选项参数,那么资源的初始化和清除函数名变为:

int QT_RCC_MANGLE_NAMESPACE(qInitResources_application)();
int QT_RCC_MANGLE_NAMESPACE(qCleanupResources_application)();

QT_RCC_MANGLE_NAMESPACE() 这个宏其实没什么用,仅用于提示作用。资源的初始化函数和清除函数会在资源加载和卸载时自动被调用。

应用程序的内嵌资源通常不需要手动初始化,但也有例外情况,比如在使用某些链接库中的资源文件时,如果出现使用了正确的文件路径 ":/images/copy.png" 却找不到资源里图片文件的情况,那么需要在使用该资源的类声明里或者在 main 函数里打头的位置加入一句手动初始化:

Q_INIT_RESOURCE(resources);

resources 是指 resources.qrc 的简短名字形式,不需要扩展名。

Qt中rcc工具简介相关推荐

  1. QT中VideoProbe的简介和实现

    一.遇到问题        在Android机上使用QT进行图像处理程序设计的时候,遇到的一个比较明显的问题就是图片采集的问题----摄像头获得是实时的视频,如果我们想从中动态地截获图片,并且转换成M ...

  2. spark中RSS工具简介

    一.Spark Shuffle 对于 spark shuffle 这一过程,网络上有非常多的文章进行说明,这里简单描述介绍下. Spark 包含三种 shuffle writer,上图展示的是 Byp ...

  3. Qt中的QMainWindow

    文章目录 1 Qt中的QMainWindow简介 1.1 应用程序中的主窗口 1.2 QMainWindow 2 QMainWindow中的菜单栏 3 QMainWindow中的工具栏 4 QMain ...

  4. QT-QT简介,QT环境与工具链(day1)

    一.QT简介 QT是跨平台的C++ GUI应用程序开发框架 QT版本查看:qmake -v 1.QT的发展历史 1)1991年诞生//Haavard Nord,Eirik Chambe-Eng 2)1 ...

  5. 【Qt】Qt中JSON简介

    00. 目录 文章目录 00. 目录 01. JSON简介 02. JSON Support in Qt 03. JSON类 04. 附录 01. JSON简介 1.1 JSON概述 JSON(Jav ...

  6. Linux 中的 netcat 网络工具简介

    Linux 中的 netcat 网络工具简介 Apr 3, 2020 |  Linux |  linux netcat netcat 是 Linux 系统中的网络工具,其通过 TCP 和 UDP 协议 ...

  7. Qt Designer中布局工具的使用

    从anaconda启动QtDesigner anaconda3是自带QtDesigner以及pyqt库的.QtDesigner的位置在%anaconda3%\Library\bin文件夹(其中%ana ...

  8. Qt中关于 QAbstractButton与QButtonGroup简介

    一.在Qt中,我们使用按钮,有四种按钮供我们选择.如下图所示: PushButton: 点击式的命令按钮 RadioButton: 单选按钮,单选按钮会对同一个布局中的其它按钮增加互斥性. Check ...

  9. QT中PRO文件写法的详细介绍

    在QT中,有一个工具qmake可以生成一个makefile文件,它是由.pro文件生成而来的,.pro文件的写法如下: 1. 注释 从"#"开始,到这一行结束. 2.模板变量告诉q ...

最新文章

  1. 全国移动联通基站数据升级包(2013年1月基站升级包).rar
  2. 软件测试基础 - 测试覆盖率
  3. 福建省计算机应用考试成绩,福建省高等学校非计算机专业学生计算机应用水平等级考试成绩查询...
  4. 高并发编程-自定义简易的线程池(2),体会原理
  5. Java 对比Vector、ArrayList、LinkedList
  6. python区间分组_python-进行分组时保留其他列
  7. [日常折腾之码上归一]多种编程语言打印当前系统时间
  8. CocoaPods打包静态库
  9. nodejs进入mysql数据库_nodejs简单访问及操作mysql数据库的方法示例
  10. php对键盘控制,键盘控制 - 陈映亮的个人空间 - OSCHINA - 中文开源技术交流社区...
  11. C语言计算表达式咋写,C语言如何计算表达式(x++)+(++x)+(x++)
  12. tensorflow之卷积神经网络
  13. qca9377linux无线驱动,ubuntu下安装无线网卡去驱动Qualcomm-Atheros-QCA9377
  14. 【读书笔记】推荐系统实践-常见推荐算法及应用
  15. 大数据学习入门难,中科天玑给初学者支几招
  16. asp.net core abp 视频教程1
  17. 【转载】英语动词过去式ed的发音规则
  18. 动态口令,动态密码生成(OTP)
  19. 用pe修改计算机ip地址,实现WinPE上网功能修改IP及DNS方法
  20. MATLAB面向对象_及_AppDesigner使用

热门文章

  1. 一、面试题(持续跟新)
  2. JS判断GridView中复选框有没有被选中
  3. UA PHYS515 电磁理论I 麦克斯韦方程组基础4 介质中的麦克斯韦方程
  4. UA MATH566 统计理论 一个例题 Hierarchical Model的统计性质
  5. 三维比例变换学习(WPF演示)
  6. WPF 3D 学习 - 3D材质初步
  7. DirectX Shader 入门学习
  8. Eclipse开发Spring MVC入门示例
  9. Set 的合集 并集 差集
  10. pandas.read_csv() 报错 OSError: Initializing from file failed,报错原因分析和解决方法