不同的':/foo ', ' qrc:/foo '和' qrc:///foo '路径在Qt

Difference between `:/foo`, `qrc:/foo` and `qrc:///foo` paths in Qt

本文关键字:foo qrc 路径 Qt      更新时间:2023-10-16

代码成功:

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

下面的代码输出"failure":

QFile file("qrc:/main.qml");
if ( file.open(QIODevice::ReadOnly) ) {
    cout << "success" << endl;
} else {
    cout << "failure" << endl;
}

将QFile构造函数参数更改为qrc:///main.qml(如在Qt文档中)并不能修复它。如果将其更改为:/main.qml,则会显示"success"。

所以我对何时使用这三种形式感到困惑。

如您的链接所述,:/main.qml是文件路径,而qrc:/main.qml是url。

前者可用于需要文件路径的地方——基本上是QString,就像QFile构造函数一样。

后者可以在需要url的地方使用,比如QQmlApplicationEngine::loadQUrl。它不能与QFile构造函数一起使用,当需要一个路径时。

关于qrc:///,一个简化的url语法(不需要查询、用户/密码、端口)可以是:

scheme:[//host][/]path

如果跳过host部分,则会导致scheme:/path,如果将host指定为空字符串,则会导致scheme:///path。来自RFC 3986:

例如,文件"定义的URI方案使得没有权限,为空主机,和"localhost"all 表示最终用户的机器,而"http"Scheme认为缺少授权或空主机无效。

看起来Qt的开发人员在设计qrc方案时遵循了file方案的规则。毕竟,这里的资源只是终端用户机器上的文件。(实际上,在最终用户机器上的可执行文件中)。所以qrc:/main.qmlqrc:///main.qml只是两个相同url的文字。