Qt资源系统中前缀优于文件系统路径的优势是什么?

时间:2018-02-27 15:44:57

标签: c++ qt qt-resource

Qt resource file .qrc允许将嵌入的文件拆分为不同的前缀

<RCC>
    <qresource prefix="/qml">
        <file alias="CustomWidget.qml">qml/CustomWidget.qml</file>
    </qresource>
    <qresource prefix="/icons">
        <file alias="home.png">icons/home.png</file>
    </qresource>
</RCC>

我经常看到开发人员使用上面的例子重做文件系统层次结构。但在我看来,它与调用者代码的观点完全相同:

<RCC>
    <qresource>
        <file>qml/CustomWidget.qml</file>
        <file>icons/home.png</file>
    </qresource>
</RCC>

在这两种情况下,您都可以使用C ++中的文件使用相同的语法:/qml/CustomWidget.qml

在文件系统路径上使用前缀+别名是否有任何优势?

2 个答案:

答案 0 :(得分:3)

这只是一种将资源id与实际文件系统对象分离的方法。一旦定义了引用资源的前缀和别名,即使资源文件发生更改(即由另一个具有不同名称和路径的文件替换),代码也不会受到影响。

假设您有许多应用程序共享的图像存储库,您可以像这样引用 qrc 中的文件:

<RCC>
    <qresource prefix="/pics">
        <file alias="logo">../../../../pictures/logos/logo-001.png</file>
    </qresource>
</RCC>

代码在长文件路径上几乎是不可知的,资源的引用如下:

QPixmap pix(":/pics/logo");

如果需要其他徽标,或者存储库已移至其他位置,则只需编辑 qrc 文件:

<RCC>
    <qresource prefix="/pics">
        <file alias="logo">../../../new-repo/logos/logo-002.png</file>
    </qresource>
</RCC>

答案 1 :(得分:0)

此行为将文件路径重新映射到逻辑空间路径,这意味着,即使您有许多文件位于不同的路径中,也可以将它们组合为一个逻辑文件夹。

这项技术反映了C ++或Java中相同的名称空间概念。

例如:

您有以下文件,但它们不在同一文件夹中。

$b

为方便起见,您需要使文件访问更加一致且不受文件位置更改的影响。

然后,应实施qt资源重新映射技术,其外观如下所示:

|---bar
   |---ca.cc
   |---da.cc
|---foo
   |---fa.cc
   |---ga.cc

注意:因为您已将所有文件放入一个逻辑文件夹(实际上是相同的名称空间),所以文件名不应相同。