2014-12-18 8 views
9

Мы разрабатываем наше первое приложение Qt/QML (технология тестирования). Хотя технология выглядит очень многообещающей с первого взгляда, мы столкнулись со столькими неожиданными странными проблемами, которые почти сдались с самого начала.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. Написал этот вопрос, проведя целый день, чтобы решить проблему самостоятельно через документацию/google/stackoverflow; никакого успеха вообще (большинство примеров используют вложение ресурсов, другие слишком простые и просто используют относительные пути).

+0

'Это абсолютно безумный. Во время разработки файлы иногда перемещались между папками (вы перемещаете файл QML и должны исправить весь путь, который у него есть?!); '-> Что безумно в разработке во время разработки фразы? Очевидно, что если вы не создадите его правильно, просто выполняйте планирование грузов, вам может потребоваться переоснастить материал новым дизайном. Разве это тоже безумие, что вы переименовываете что-то повсюду, когда вы переименовываете что-то, потому что понимаете, что вы дали неправильное имя переменной? Давай, Алексей ... :) Сед - твой друг ... – lpapp

+2

@lpapp Это безумие, потому что если файл изображения остается на том же месте, то абсолютно нормально, чтобы ссылка на этот файл оставалась неизменной в коде приложения и не зависят от перемещения других вещей. Разве нет? Если какой-то файл QML относится к некоторому изображению, и это изображение остается в одном месте все время, зачем нужно исправлять этот QML каждый раз, когда он хочет переместить его в другую папку? Это то, о чем я говорю. При использовании файлов qrc у вас нет такой проблемы, но с сырыми ресурсами мы просто не можем найти решение, к сожалению. –

ответ

10

Если вы не можете использовать .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" 
} 

Обратите внимание, что этот код не тестируется.

+2

Спасибо @Mitch! Кажется, это возможное решение. Просто протестировал его. Чтобы запустить его, нужно добавить файл ': file: ///' 'в' QGuiApplication :: applicationDirPath() '. И кажется, что введенное значение 'applicationDirPath' доступно во всех файлах QML, загружаемых приложением, а не только в основной, загруженный' engine.load (...) '(меня это беспокоило в начале). Может быть немного улучшено путем передачи текущего рабочего каталога процесса, чтобы избежать '/../' на пути относительных ресурсов и должен работать в отладочных запусках в QT Creator и в автономных запусках приложений. Большое спасибо! –

+0

Я не мог сказать, так как я не тестировал это с помощью теста. Очень легко настроить тест с мастером проекта Qt Creator, хотя (даже в тесте QML), и профилировщик QML Creator может помочь вам выявить любые узкие места. – Mitch

+0

Спасибо @Mitch! Будет исследовать профилирование QML. –

1
Image { 
    source: "file:resources/images/image.png" 
} 

будет работать если рабочий каталог устанавливается в ApplicationFolder

Примечание: при работе от QtCreator, двойной проверки какой директории приложение фактически выполняется в (я имел мое приложение работало в моем доме хотя рабочий каталог был правильно настроен в конфигурации запуска (после запуска его один раз в окне терминала это волшебное исправление)

Смежные вопросы