此代码成功:
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
会使它打印“成功”。所以我对何时使用这三种形式感到困惑。
最佳答案
如link中所述,:/main.qml
是文件路径,而qrc:/main.qml
是URL。
前者可以在需要文件路径的地方使用-基本上是QString
,就像QFile
构造函数一样。
后者可用于需要url的地方,例如QQmlApplicationEngine::load
到QUrl
。不能与需要路径的QFile
构造函数一起使用。
关于qrc:///
,简化的url语法(不带查询,用户/密码或端口)可以是:
scheme:[//host][/]path
如果您跳过
scheme:/path
部分,则可能会导致host
;如果您将scheme:///path
指定为空字符串,则可能会导致host
。从RFC 3986:看起来Qt的开发人员在设计
file
方案时遵循了qrc
方案的规则。毕竟,这里的资源只是“最终用户计算机上”的文件(实际上,在最终用户计算机上的可执行文件内部)。因此qrc:/main.qml
和qrc:///main.qml
只是同一个网址的两个文字。有关完整的URL语法,请参见here。