Qt中`:/ foo`,`qrc:/ foo`和`qrc:/// foo`路径之间的区别

时间:2016-09-26 11:41:56

标签: c++ qt url path resources

此代码成功:

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

此代码打印“失败”:

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

将QFile构造函数参数更改为qrc:///main.qml(如Qt documentation中所述)并不能解决问题。将其更改为:/main.qml会使其打印成功。

所以我很困惑何时使用3种形式中的每一种。

1 个答案:

答案 0 :(得分:5)

link所述,:/main.qml是文件路径,而qrc:/main.qml是网址。

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

后者可用于需要网址的地方,例如QQmlApplicationEngine::loadQUrl。它不能与需要路径的QFile构造函数一起使用。

关于qrc:///,简化的url语法(没有查询,用户/密码和端口)可以是:

scheme:[//host][/]path

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

  

例如,定义了“文件”URI方案,以便无权限,空主机和“localhost”所有表示最终用户机器,而“http”方案认为缺少权限或空主机无效。

在设计file方案时,看起来Qt的开发人员遵循qrc方案的规则。毕竟,这里的资源只是“在最终用户的机器上”的文件(事实上,在最终用户机器上的可执行文件内)。因此,qrc:/main.qmlqrc:///main.qml只是同一个网址的两篇着作。

有关完整的网址语法,请参阅here