我们正在开发我们的第一个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解决了这个问题后写了这个问题;根本没有成功(大多数示例使用资源嵌入,其他示例太简单,只使用相对路径)。
答案 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。