一、问题背景
QT项目运行时,出现所有的图片和图标都无法显示的情况:
以为是文件路径出现了问题,然后查看ui文件,却没有发现问题:
这说明文件已经被读取到了。后来查阅QT文档,了解到QT的资源管理机制需要提供额外的qrc文件才能将文件加载成功,感觉很有意思,所以记录下来。
二、资源管理系统
QT项目内部引入资源管理系统的目的是为了让资源的加载完全脱离于平台之外,也就是说不管你的系统是Windows, macOS, 还是iOS,QT对资源的获取均采用相同的方式。
1、QT资源编译器rcc
简而言之,rcc编译器会将qt运行时所需要的所有资源文件全部编译成.rcc文件并加载到程序中使用。也就是说程序只需要从.rcc里获取资源即可,与资源存放的具体路径无关,而.rcc文件的生成需要让我们为rcc编译器提供资源采集文件.qrc。
2、QT资源采集文件qrc
qrc文件的编写至关重要,这个文件本质就是一个XML文件,它将资源文件以DOM树的形式组织起来。
<RCC>
<qresource prefix="/">
<file>images/bold.png</file>
<file>images/copy.png</file>
<file>images/create.png</file>
</qresource>
</RCC>
如图所示即是一个qrc文件,其中file标签内部填写文件真实所处的位置,这里需要填写qrc与资源文件的相对位置,比如说上述写法里,qrc文件同级目录中的images文件夹下存放着所有的png文件。如果地址写错会无法定位资源。prefix则是为资源的命名添加前缀以区分不同qrc文件下的同名资源。
3、使用qrc里采集到的资源
我们可以直接使用file标签内定义的路径在项目中使用资源,格式如下 :/images/bold.png ,可以直接实例化QFile,QDir, QIcon, QImage 以及QPixmap对象。例如QFile file(“:/images/bold.png”);
4、使用别名使得资源定位更加简单
别名的使用使得QT文件的路径更加简约。
<RCC>
<qresource prefix="abc">
<file alias = "keywords">config/keywords.txt</file>
</qresource>
</RCC>
如上图所示,对txt资源定位,使用前缀abc和别名keywords,其使用过程更为简单:QFile file(“:/abc/keywords”);
这样有什么好处呢?
如果资源文件变更了位置,我们只需要对qrc文件里的file标签内容进行修改即可,而不需要对代码进行任何修改,实现了资源与代码的解耦合。
5、配置CMakeLists
最后一步,如果CMAKE_AUTORCC未开启,可以手动将qrc文件的路径添加到CMakeLists的add_executable()配置项中,这样就所有的资源就全部加载成功了。