此代码成功:
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种形式中的每一种。
答案 0 :(得分:5)
如link所述,:/main.qml
是文件路径,而qrc:/main.qml
是网址。
前者可用于需要文件路径的地方 - 基本上是QString
,与QFile
构造函数一样。
后者可用于需要网址的地方,例如QQmlApplicationEngine::load
到QUrl
。它不能与需要路径的QFile
构造函数一起使用。
关于qrc:///
,简化的url语法(没有查询,用户/密码和端口)可以是:
scheme:[//host][/]path
如果您跳过scheme:/path
部分,则可导致host
;如果您将scheme:///path
指定为空字符串,则可导致host
。来自RFC 3986:
例如,定义了“文件”URI方案,以便无权限,空主机和“localhost”所有表示最终用户机器,而“http”方案认为缺少权限或空主机无效。
在设计file
方案时,看起来Qt的开发人员遵循qrc
方案的规则。毕竟,这里的资源只是“在最终用户的机器上”的文件(事实上,在最终用户机器上的可执行文件内)。因此,qrc:/main.qml
和qrc:///main.qml
只是同一个网址的两篇着作。
有关完整的网址语法,请参阅here。