Система ресурсов Qt
Система ресурсов Qt - платформо-независимый механизм для сохранения двоичных файлов в исполняемом файле приложения. Это полезно если вашему приложению всегда необходим определённый набор файлов (пиктограммы, файлы перевода и т.д.) и вы не хотите подвергнуться риску потерять файлы.
Система ресурсов основана на тесном взаимодействии между qmake, rcc (компилятор ресурсов Qt) и QFile. Она сделала устаревшими инструмент Qt 3 qembed и механизм коллекций изображений.
Файлы коллекции ресурсов (Resource Collection Files, .qrc)
Ресурсы, связанные с приложением, указываются в файле .qrc, формат файла основан на XML, в котором перечисляются файлы на диске и опционально присваивает им имя ресурса, которое приложение должно использовать для доступа к ресурсу.
Вот пример файла .qrc:
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>images/copy.png</file>
<file>images/cut.png</file>
<file>images/new.png</file>
<file>images/open.png</file>
<file>images/paste.png</file>
<file>images/save.png</file>
</qresource>
</RCC>
Файлы ресурсов, перечисленные в файле .qrc, являются частью дерева исходников приложения. Указываемые пути являются относительными к каталогу, содержащему файл .qrc. Обратите внимание на то, что перечисленные файлы ресурсов должны располагаться в том же каталоге, что и файл .qrc, или в одном из подкаталогов.
Данные ресурса могут либо быть скомпилированы в двоичном виде и таким образом получить доступ непосредственно в коде приложения, либо двоичный ресурс может быть создан и позднее ссылаться на него в коде приложения зарегистрированный с помощью системы ресурсов.
По умолчанию, ресурсы доступны в приложении под тем же именем, под которым они находятся в дереве исходников, с помощью префикса :/. Например, путь :/images/cut.png даст доступ к файлу cut.png, чьё расположение в дереве исходников приложения images/cut.png. Это можно изменить используя у тега file атрибут alias:
<file alias="cut-img.png">images/cut.png</file>
Тогда получить доступ к файлу из приложения можно как :/cut-img.png. Также возможно задать префикс пути для всех файлов в файл .qrc используя в теге qresource атрибут prefix:
<qresource prefix="/myresources">
<file alias="cut-img.png">images/cut.png</file>
</qresource>
В этом случае доступ к файлу можно получить как :/myresources/cut-img.png.
Некоторые ресурсы, такие как файлы перевода и пиктограммы, нужно изменить на основе пользовательской локали. Это делается добавлением атрибута lang к тегу qresource, указывающую соответствующую локализованную строку. Например:
<qresource>
<file>cut.jpg</file>
</qresource>
<qresource lang="fr">
<file alias="cut.jpg">cut_fr.jpg</file>
</qresource>
Если локаль пользователя является французской (т.е., QLocale::system().name() возвращает "fr_FR"), :/cut.jpg становится в ссылку на изображение cut_fr.jpg. Для других локалей используется cut.jpg.
Описание формата для использования с локализованными строками смотрите документацию QLocale.
Внешние двоичные ресурсы
Для созданных внешних двоичных ресурсов вы должны создать данные ресурса (обычно получают расширение .rcc) передав ключ -binary в rcc. После создания двоичного ресурса вы можете зарегистрировать ресурс с помощью QResource API.
Например, набор данных ресурса, указанный в файле .qrc, может быть скомпилирован следующим образом:
rcc -binary myresource.qrc -o myresource.rcc
В приложении этот ресурс регистрируется с помощью такого кода:
QResource::registerResource("/path/to/myresource.rcc");
Скомпилированные ресурсы
Ресурсы, скомпилированные в двоичный файл .qrc, должны быть упомянуты в .pro-файле приложения так что qmake будет знать о них. Например:
RESOURCES = application.qrc
qmake произведёт make-правила для генерации фалйа с именем qrc_application.cpp, который компонуется с приложением. Этот файл содержит все данные для изображений и других ресурсов как статические массивы C++ сжатых двоичных данных. Файл qrc_application.cpp автоматически генерируется заново всякий раз, когда изменяется файл .qrc или изменяется один из файлов, на который он ссылается. Если вы не используете .pro файлы, вы можете либо вызвать rcc вручную, либо добавить правила сборки в вашу систему сборки.
В настоящее время Qt всегда сохраняет данные непосредственно в исполняемом файле, даже в Windows и Mac OS X, где операционная система предоставляет "родную" поддержку для ресурсов. Это может измениться в будущих выпусках Qt.
Использование ресурсов в приложении
В приложении пути к ресурсам могут быть использованы большинстве мест вместо обычных системных путей к файлу. В частности, вы можете передать путь к ресурсу вместо имени файла в конструктор QIcon, QImage или QPixmap:
cutAct = new QAction(QIcon(":/images/cut.png"), tr("Cu&t"), this);
Реальное приложение, которое использует систему ресурсов Qt для хранения своих пиктограмм, смотрите в примере Application.
В памяти ресурсы представлены деревом объектов ресурса. Дерево автоматически создаётся при запуске и используется QFile'ом для разрешения путей к ресурсам. Вы можете использовать QDir, инициализированный с ":/", для навигации по дереву ресурсов начиная с корня.
Ресурсы в Qt поддерживают концепцию списка путей поиска. Если затем вы ссылаетесь на ресурс с помощью префикса : вместо :/, поиск ресурса будет вестись с использованием списка путей поиска. Список путей поиска при запуске пуст; вызовите QDir::addResourceSearchPath() для добавления в него путей.
Если у вас имеются ресурсы в статической библиотеке, вам может понадобиться форсировать иницализацию ваших ресурсов вызывая Q_INIT_RESOURCE() с базовым именем файла .qrc. Например:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Q_INIT_RESOURCE(graphlib);
...
return app.exec();
}
Подобным же образом, если вы должны явно выгрузить набор ресурсов (поскольку был выгружен подключаемый модуль или ресурсы больше не являются допустимыми), вы можете форсировать удаление ваших ресурсов вызывая Q_CLEANUP_RESOURCE() с тем же базовым именем что и выше.
Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies) |
Торговые марки |
Qt 4.5.3 |
|