Question QML: comment spécifier le chemin du fichier image par rapport au dossier de l'application


Nous développons notre première application Qt / QML (technologie éprouvante). Bien que la technologie semble très prometteuse en un coup d’œil, nous avons dû faire face à tant de problèmes étranges et inattendus qui ont failli céder au tout début.

Voici l'une de ces questions.

Nous souhaitons la mise en page de dossiers suivante pour notre application:

--> 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

Le problème est que pour spécifier le fichier image pour Image Élément QML nous devons utiliser le chemin relatif au fichier QML?! C'est absolument fou. Pendant le développement, les fichiers sont parfois déplacés entre les dossiers (vous déplacez le fichier QML et vous devez corriger tout le chemin d'accès qu'il contient?!); certains fichiers QML doivent se référer à la même image (même ressource d'image mais chemin d'accès différent dans différents fichiers QML).

La question est donc de savoir comment spécifier le chemin d’image par rapport au dossier de l’application. Est-ce possible?

Merci d'avance!

PS L'utilisation du système de ressources de Qt (lorsque des ressources sont incorporées dans un fichier exécutable) n'est pas une option dans notre cas. Nous avons besoin de ressources brutes sur disque (y compris les fichiers QML, du moins pendant la phase de développement).

PPS. A écrit cette question après avoir passé une journée entière à résoudre le problème par moi-même via la documentation / google / stackoverflow; pas de succès du tout (la plupart des exemples utilisent l'incorporation de ressources, d'autres sont trop simples et utilisent simplement des chemins relatifs).


10
2017-12-18 15:10


origine


Réponses:


Si vous ne pouvez pas utiliser un fichier .qrc pour vos images, vous pouvez essayer ceci:

#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();
}

Dans QML, vous feriez alors:

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

Notez que ce code n'est pas testé.


15
2017-12-18 22:32



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

marchera si le répertoire de travail est défini sur le dossier ApplicationFolder

Remarque: lors de l'exécution de QtCreator, vérifiez le répertoire dans lequel l'application s'exécute (mon application a été exécutée dans mon répertoire personnel même si le répertoire de travail était correctement défini dans la configuration d'exécution (après l'avoir exécutée comme par magie dans un terminal) s'est fixé))


1
2018-02-03 11:55