概述
在Qt中使用添加资源文件的时候,对于资源文件名称的定义,往往是较为随意的。
但是当涉及到Qt库依赖的时候,则可能需要遵守一定的规则,否则可能出现文件找不到或者错误加载的问题。
环境
环境名称 | Qt 版本 | 系统版本 |
---|---|---|
Linux | Qt 5.12.7 ,MSVC 2017 | win 11 x64 |
Windows | Qt 5.12.7 | SUSE Linux 15.3 |
描述
如下图所示,模块A是一个可执行程序,模块B和模块C是两个库。模块之间存在依赖关系,如下:模块A依赖模块B和模块C,模块B也同时依赖模块C。
当这三个模块都有资源文件,如下所示:
资源文件" />
其中,模块B和模块C的资源文件是相同的文件名称res.qrc
。
当这三个模块分别编译的时候,没有出现任何问题;实际在运行的时候,在Linux(尝试的系统是SUSE 15.3)上可能会出如下问题:
":/images/img3.png" Cannot find.
这样发现在Linux下会屏蔽同名的资源文件,使得其中的资源找不到;在Windows上没有找到类似问题。
为了解决以上问题,将依赖库中的同名资源文件名称修改成不同, 如下所示:
再次运行,发现上述问题已经解决。
再次观察,resB.qrc
和 resC.qrc
中的资源存在同名问题,都存在:/images/img1.png
文件 ,但是实际上两者是不同的资源,只不过是在各自模块中的名称相同。
当在模块B和模块C中都分别用到了各自的资源,在模块A中分别调用模块B和模块C中依赖的资源,这时候发现在Linux和Windows上调用都出现了问题,它们都将其识别成了同一个文件,例如:本应该各自模块显示各自的图像,现在显示成相同的图像了。
这时候就需要注意,即使在不同的存在依赖性的模块中,也需要区分资源文件的路径名称。
汇总
问题名称 | Linux 情况 | Windows情况 | 建议 |
---|---|---|---|
依赖模块中的资源文件名相同 | 存在问题 | 情况良好 | 不同模块的资源文件使用不同的名称 |
资源文件中路径相同 | 存在问题 | 存在问题 | 资源文件中,不同模块使用不同的资源前缀 |