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

时间:2014-12-18 15:11:00

标签: 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

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

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

提前致谢!

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

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

3 个答案:

答案 0 :(得分:19)

如果您不能将.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"
}

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

答案 1 :(得分:2)

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

如果工作目录设置为ApplicationFolder

注意:从QtCreator运行时,请仔细检查应用程序实际运行的目录(我的应用程序在我的主目录中运行,即使在运行配置中正确设置了工作目录(在终端中运行一次后)窗口这神奇地固定了自己))

答案 2 :(得分:-1)

旧问题,但来自Google。对我来说,它仅适用于这样的相对路径:

import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.3

[...]    

Image {
    id: image
    source: "icons/brightness.svg" // simple relative path
    width: 22
    height: 22
    sourceSize.width: 22 // svg render resolution
    sourceSize.height: 22
    fillMode: Image.PreserveAspectFit // just in case to avoid stretching
}

不需要.qrc。