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

Posted

技术标签:

【中文标题】Qt资源系统中前缀优于文件系统路径的优势是啥?【英文标题】:What is the advantage of prefix over filesystem path in Qt resource system?Qt资源系统中前缀优于文件系统路径的优势是什么? 【发布时间】:2018-02-27 15:44:56 【问题描述】:

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 的文件。

在文件系统路径上使用前缀+别名有什么好处吗?

【问题讨论】:

【参考方案1】:

这只是一种将资源 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>

【讨论】:

你说得有道理,对于这样的外部资源,它可以很方便。但是在一个项目中,文件只为你准备,我发现在文件系统中重命名文件以适应我的 QRC 更简单。【参考方案2】:

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

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

例如:

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

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

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

然后,应该实现qt资源重映射技术,如下所示:

|---uniFolder
   |---ca.cc
   |---da.cc
   |---fa.cc
   |---ga.cc

注意:因为你已经把所有文件放在一个逻辑文件夹中(实际上是同一个命名空间),所以文件名不应该相同。

【讨论】:

以上是关于Qt资源系统中前缀优于文件系统路径的优势是啥?的主要内容,如果未能解决你的问题,请参考以下文章

添加资源文件

QT设置窗口图标

6.1 QDir目录操作

在 ASP.NET 中使用 Web API 优于 Web 方法的优势是啥

Hadoop文件系统中目录的路径是啥?

Linux系统的特点是啥?