2.3 QT资源文件
实际的应用程序中会用到大量的图片、图标或者其他类型的文件。Qt专门定义了一套资源系统,资源文件的格式为*.qrc。 *.qrc 文件通过rcc资源编译器生成一个名称格式为qrc_*.cpp的标准 C++ 文件,然后就可以通过任意的 C++ 编译器编译,与其他源文件一块链接到目标程序里使用。qrc文件在编译后会将资源编译链接进程序内部,在发布应用程序的时候就不需要带上一堆文件夹,省去了一切麻烦。如果资源文件太大,超过了4以上的文件就不建议放在资源文件中,编译会出现错误。这些大的文件可以使用系统路径访问或者外挂资源方式访问。
Qt 系统资源系统基于 qmake、rcc和 QFile 三方面紧密合作,让资源文件的使用与普通操作系统里的文件使用方式很相似,Qt 应用程序内部的资源文件有一套自己的虚拟文件系统,文件路径形式":/save.png" ,冒号开头的就是代表访问内嵌的资源文件。所有内嵌的资源文件都是只读的,在程序运行时不能修改资源里的文件,只能读取使用。
2.3.1 建立资源文件
(1)先打开 QtCreator,新建一个 Qt Widgets Application 项目,继承Qwidget类,项目名称为FesourceFile。
(2)鼠标选中工程左边的项目视图文件夹,单击鼠标右键添加新的文件。
图2-23 添加新文件
(3)选择QT资源文件
图2-24 选择新建资源文件类型
(4)设置资源文件的名称和存放路径
图2-25 设置资源文件的名称
(5)将资源文件添加到当前的项目中
图2-26 添加资源文件到项目中
(6)向资源文件中添加需要内嵌到程序的文件
图2-27 添加文件
(7)资源文件管理器
鼠标选中qrc资源文件,右键->open with-->选择打开资源文件的方式。资源管理器可以修改资源文件的访问路径和别名(程序内部使用的名称)。
图2-28 打开资源文件方式及资源文件编辑
(8)查看资源文件在程序中的访问路径
选中一个资源文件,鼠标单击右键可以看到两种访问的方法。鼠标左键单击即可复制到裁剪板。
图2-29 资源文件的访问路径
2.3.2 qrc文件格式
qrc文件的格式与ui文件一样都是XML格式。上一步建立的image.qrc资源文件内容如下:
<RCC>
<qresource prefix="/">
<file>image/b_close.png</file>
<file>image/b_ok.png</file>
</qresource>
</RCC>
qresource prefix="/" :表示了资源文件的前缀。
<file>image/b_close.png</file> :表示资源文件访问的路径。
可以手动修改资源文件内容进行添加新文件。 image.qrc通过rcc工具编译后会生成一个qrc_image.cpp文件。
2.3.3 设置按钮图标
设置按钮图标可以通过UI设计师设置,也可以通过setIcon函数进行设置。
(1)通过UI设计师设置按钮图标示例
图2-30 添加按钮图标
(2)通过代码方式设置按钮图标示例(配套程序编号CH2-6)
ui->pushButton_ok->setIcon(QIcon(":/image/b_ok.png"));
ui->pushButton_close->setIcon(QIcon(":/image/b_close.png"));
效果图:
图2-31 图标运行效果图
2.3.4 外挂资源文件
较大的资源文件一般不编译链接到应用程序内部,可以使用rcc命令编译成单独的资源文件,在程序中进行调用。
rcc工具在QT的安装目录下,比如:C:\Qt\QT5.7.0_MIGW\5.7\mingw53_32\bin。rcc命令工具需要在命令行中使用,还需要将rcc工具的路径添加到电脑系统的PATH环境变量中。环境变量添加后重启电脑即可永久生效。
以下截图是添加环境变量的步骤(win10系统):
图2-31 添加环境变量(win10系统)
1.新建一个qrc格式的文本文件,名称为external_reseouce.qrc,内容如下:
<RCC>
<qresource prefix="/">
<file>image/b_close.png</file>
<file>image/b_ok.png</file>
<file>video/bs.mp4</file>
</qresource>
</RCC>
2.文件夹的布局
图2-32 新建资源文件
3.编译资源文件
打开命令行窗口,进入到资源文件存放的路径下,输入以下命令进行编译:
rcc -binary external_reseouce.qrc -o external_reseouce.rcc
编译成功后,rcc会把 external_reseouce.qrc 里面描述的所有图片、视频等文件,都压缩打包,生成一个二进制的 external_reseouce.rcc 文件,这个external_reseouce.rcc 包含了所有的资源。
图2-33 编译资源文件过程
4.引用资源文件
引用外部资源需要在main函数里进行注册,之后在程序中引用方式与前面讲的内嵌资源访问形式一样。
注册资源文件需要使用registerResource静态函数,原型如下。
static bool registerResource(const QString &rccFilename, const QString &resourceRoot=QString());
static bool unregisterResource(const QString &rccFilename, const QString &resourceRoot=QString());
static bool registerResource(const uchar *rccData, const QString &resourceRoot=QString());
static bool unregisterResource(const uchar *rccData, const QString &resourceRoot=QString());
registerResource是一个重载函数,可以填资源文件的路径也可以填二进制数据指针。资源文件加载成功返回true,失败返回false。
unregisterResource与registerResource功能相反,用来注销不使用的资源。
注册资源文件的格式示例
QResource::registerResource("external_reseouce.rcc");
完整代码示例(配套程序编号CH2-7)
#include "widget.h"
#include <QApplication>
#include <QResource>
int main(int argc, char *argv[])
{
QResource::registerResource("external_reseouce.rcc"); //资源文件路径根据实际路径填写
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
引用示例
ui->pushButton_ok->setIcon(QIcon(":/image/b_ok.png"));
ui->pushButton_close->setIcon(QIcon(":/image/b_close.png"));
运行效果图
图2-34外挂资源运行效果图