Каждое серьезное приложение с графическим пользовательским интерфейсом (и не только) использует файлы ресурсов. При этом у вас есть два варианта: либо подключать ресурсы по относительным путям файловой системы, либо поместить их прямо внутрь бинарного файла приложения или библиотеки. У каждого из этих подходов есть свои преимущества и недостатки.
В первом случае (ресурсы — внешние файлы) приложение становится более гибким, поскольку ресурсы можно менять без пересборки, однако пользователи могут случайно (или специально) испортить часть ресурсов, нарушив корректность работы приложения. К тому же, если относительные пути приложения собьются, то файлы ресурсов не будут найдены.
С ресурсами, вшитыми в бинарный файл, ситуация прямо противоположная: приложение становится монолитным, исполняемый файл имеет большой размер, любое изменение требует пересборки, но случайно нарушить его работоспособность (например, подменив изображение) становится практически невозможно.
С учетом всех плюсов и минусов последний вариант в большинстве случаев является предпочтительным. О нем мы и поговорим.
Создание файла с описанием ресурсов
Первым делом создайте файл с описанием тех ресурсов, которые собираетесь использовать. Он имеет следующий вид (назовем его res.qrc
):
1 2 3 4 5 |
<RCC> <qresource prefix="/images"> <file>logo.png</file> </qresource> </RCC> |
В приведенном примере мы определили один префикс: /images
. Его можно считать логическим каталогом ресурсов. Таких префиксов может быть сколько угодно. Например, если в вашем приложении есть звуковые эффекты, то вы можете добавить префикс /sounds
. Для создания более глубокой иерархии используйте префиксы вида /some/long/prefix
.
В тег <qresource>
вложены определения файлов, относящихся к соответствующему префиксу. В примере включено единственное изображение logo.png
, но вы можете указать столько файлов, сколько необходимо. Используйте относительные пути к файлам, беря в качестве каталога отсчета — тот, в котором находится qrc
-файл.
Имеет смысл явным образом распределять ресурсы по подкаталогам в файловой системе проекта. Например, изображение logo.png
поместите в images/
. Тогда запись приобретает вид:
1 2 3 4 5 |
<RCC> <qresource prefix="/"> <file>images/logo.png</file> </qresource> </RCC> |
В этом случае логический путь к файлу logo.png
вновь имеет вид: /images/logo.png
.
Для краткости можно использовать псевдонимы следующим образом:
1 2 3 4 5 |
<RCC> <qresource prefix="/myprefix"> <file alias="logo.png">long/relative/path/to/logo.png</file> </qresource> </RCC> |
Файл доступен по логическому пути /myprefix/logo.png
.
Затем нужно привязать заполненный qrc
-файл к проекту. Для этого добавьте в ваш pro
-файл строку вида:
1 |
RESOURCES += res.qrc |
В примере выше qrc
-файл расположен на одном уровне с pro
-файлом. Если вы применяете более сложную схему размещения файлов, то воспользуйтесь относительным путем.
Обратите внимание, что в QtCreator предусмотрен довольно удобный GUI-интерфейс для работы с файлами ресурсов. Чтобы создать новый qrc
-файл, щелкните в контекстном меню для нужного проекта на пункт Add New...
. В появившемся диалоговом окне перейдите в группу Qt
и выберите Qt Resource file
. После успешного создания файла ресурсов в панели проекта вы увидите новую группу Resources
, появившуюся рядом с Headers
и Sources
. Открыв qrc
-файл вы попадете в редактор ресурсов, который вполне интуитивно позволяет выполнить те же самые действия, которые мы выполняли вручную.
Использование ресурсов в приложении
Итак, qrc
-файл готов и подключен к проекту. Осталось только воспользоваться преимуществами от его использования. И сделать это совсем не сложно:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <QApplication> #include <QLabel> int main( int argc, char* argv[] ) { QApplication a( argc, argv ); QLabel lbl; QPixmap pix( ":/images/logo.png" ); lbl.setPixmap( pix ); lbl.resize( pix.size() ); lbl.show(); return a.exec(); } |
Ключевым здесь является способ обращения к изображению (или любому другому файлу) из ресурсов. Путь строится следующим образом: сначала ставится двоеточие :
, затем префикс /images
, который мы сами выбрали, и наконец путь к файлу (или псевдоним) logo.png
. В остальном все то же самое, что и при работе с обычными файлами, предназначенными только для чтения.
Заключение
Использовать файлы ресурсов в Qt-проектах очень просто, поэтому если вам понадобилось добавить изображения, музыку или что-то еще в свое приложение, то теперь вы знаете, что нужно делать.