В чем преимущество префикса над путем к файловой системе в системе ресурсов 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
Примечание: поскольку вы поместили все файлы в одну логическую папку (фактически одно и то же пространство имен), поэтому имена файлов не должны быть одинаковыми.