此代码成功:

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::loadQUrl。不能与需要路径的QFile构造函数一起使用。

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

scheme:[//host][/]path

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



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

有关完整的URL语法,请参见here

09-06 11:20