В чем преимущество префикса над путем к файловой системе в системе ресурсов Qt?

Файл ресурсов Qt.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 ответ

Решение

Это просто способ отделить идентификаторы ресурсов от реальных объектов файловой системы. После того как вы определили префикс и псевдоним для ссылки на ресурс, даже если файл ресурса изменяется (то есть заменяется другим файлом с другим именем и путем), код остается без изменений.

Допустим, у вас есть хранилище изображений, которое используется многими приложениями, вы можете ссылаться на файлы в 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>

Это поведение повторно отображает путь к файлу на путь логического пространства, что означает, что, хотя у вас много файлов, расположенных по разным путям, их можно объединить в одну папку логики.

Эта технология отражает ту же концепцию пространства имен в C++ или Java.

Например:

У вас есть следующие файлы, но они находятся не в одной папке.

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

Для удобства вам нужно сделать доступ к файлам более согласованным и не зависеть от изменения местоположения файлов.

Затем должна быть реализована технология переопределения ресурсов qt, которая будет выглядеть следующим образом:

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

Примечание: поскольку вы поместили все файлы в одну логическую папку (фактически одно и то же пространство имен), поэтому имена файлов не должны быть одинаковыми.

Другие вопросы по тегам