web-dev-qa-db-ja.com

QML:アプリケーションフォルダーに対する画像ファイルのパスを指定する方法

私たちは最初のQt/QMLアプリケーション(試用テクノロジ)を開発しています。テクノロジーは一見すると非常に有望に見えますが、非常に多くの予期しない奇妙な問題に直面しており、当初はほとんど諦めていました。

ここでそのような問題の1つ。

アプリケーションには次のフォルダレイアウトが必要です。

--> 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を介して自分で問題を解決するために丸一日費やした後、この質問を書きました。まったく成功していません(ほとんどの例ではリソースの埋め込みを使用していますが、他の例では単純すぎて相対パスのみを使用しています)。

14
Alexey Kryshen

画像に.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"
}

このコードはテストされていないことに注意してください。

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

動作しますif作業ディレクトリはApplicationFolderに設定されます

注:QtCreatorから実行する場合、アプリケーションが実際に実行されているディレクトリを再確認してください(実行構成で作業ディレクトリが正しく設定されていても、アプリケーションをホームディレクトリで実行しました(ターミナルウィンドウで一度実行すると、この魔法のように修正済み))

2
newmind