В QML: как указать путь к файлу изображения относительно папки приложения
мы разрабатываем наше первое приложение Qt/QML (пробная технология). Хотя технология выглядит очень многообещающей на первый взгляд, мы столкнулись с таким количеством неожиданных странных проблем, которые почти сдаются в самом начале.
вот один из таких вопросов.
мы хотим следующий макет папок для нашего приложения:
--> ApplicationFolder
|--> qml // QML files (also structured by subfolders)
|--> resources // Application resources (images, sounds, data-files, etc.)
| |--> images // Image resources (also structured by subfolders)
| |--> data // Different data files
| |--> ... // Other resources
|--> Application.exe // Application executable
|--> *.dll // DLLs application depends on
проблема в том, что для указания файла изображения для Image
элемент QML мы должны использовать путь относительно файла QML?! Это абсолютно безумный. Во время разработки файлы иногда перемещаются между папками (вы перемещаете файл QML и должны исправить весь путь, который он имеет?!); некоторые различные файлы QML должны ссылаться на одно и то же изображение (тот же ресурс изображения, но другой фактический путь в разных файлах QML).
Итак, вопрос: Как указать путь к изображению относительно папки приложения? Возможно ли это вообще?
спасибо заранее!
PS. Использование ресурсной системы Qt (когда ресурсы встроены в исполняемый файл) в нашем случае это не вариант. Нам нужны необработанные ресурсы на диске (включая сами файлы QML, по крайней мере, на этапе разработки).
PPS. Написал этот вопрос, потратив целый день, чтобы решить проблему самостоятельно через documentation / google / stackoverflow; никакого успеха вообще (большинство примеров используют встраивание ресурсов, другие слишком просты и просто используют относительные пути).
2 ответов
Если вы не можете использовать .файл qrc для ваших изображений, вы можете попробовать следующее:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("applicationDirPath", QGuiApplication::applicationDirPath());
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
в QML вы бы сделали:
Image {
source: "file:///" + applicationDirPath + "/../resources/images/image.png"
}
обратите внимание, что этот код не проверял.
Image {
source: "file:resources/images/image.png"
}
совместимость Если рабочий каталог имеет значение ApplicationFolder
Примечание: при запуске из QtCreator дважды проверьте, в каком каталоге работает приложение (у меня было приложение, запущенное в моем домашнем каталоге, хотя рабочий каталог был установлен правильно в конфигурации запуска (после запуска его один раз в окне терминала это волшебным образом исправлено)))