QML:如何指定相对于应用程序文件夹的图像文件路径

Ale*_*hen 13 qt qml qtquick2

我们正在开发我们的第一个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
Run Code Online (Sandbox Code Playgroud)

问题是,为了指定ImageQML项目的图像文件,我们必须使用相对于QML文件的路径?!这绝对是疯了.在开发过程中,文件有时会在文件夹之间移动(你移动QML文件并且必须修复它拥有的所有路径?!); 一些不同的QML文件必须引用相同的图像(相同的图像资源,但不同的QML文件中的实际路径不同).

所以问题是:如何指定相对于应用程序文件夹的图像路径?有可能吗?

提前致谢!

PS.在我们的案例中,使用Qt的资源系统(当资源嵌入到可执行文件中时)不是一个选项.我们需要磁盘上的原始资源(包括QML文件本身,至少在开发阶段).

PPS.在花了一整天的时间通过文档/ google/stackoverflow解决了这个问题后写了这个问题; 根本没有成功(大多数示例使用资源嵌入,其他示例太简单,只使用相对路径).

Mit*_*tch 21

如果您不能为图像使用.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();
}
Run Code Online (Sandbox Code Playgroud)

在QML中,您可以:

Image {
    source: "file:///" + applicationDirPath + "/../resources/images/image.png"
}
Run Code Online (Sandbox Code Playgroud)

请注意,此代码未经过测试.

  • 谢谢@Mitch!这似乎是一种可能的解决方案.刚试过它.为了使它正常运行,需要将``file:///"`添加到`QGuiApplication :: applicationDirPath()`.并且似乎在应用程序加载的所有QML文件中都注入了`applicationDirPath`值,而不仅仅是在`engine.load(...)`加载的主要文件中(我在开始时关注它).可以通过传递进程的当前工作目录来改进一点,以避免相对资源路径上的`/../`,并且应该在QT Creator和独立应用程序运行中的调试运行中工作.非常感谢! (3认同)
  • 只需将`file:///`放在前面.感谢您发表评论@AlexeyKryshen! (2认同)