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

Ste*_*nov 6 c++ url resources qt path

此代码成功:

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
Run Code Online (Sandbox Code Playgroud)

此代码显示“失败”:

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

将QFile构造函数参数更改为qrc:///main.qml(如Qt文档中)不能解决该问题。更改它以:/main.qml使其打印“成功”。

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

was*_*ful 6

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

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

后者可用于其中需要的URL,就像QQmlApplicationEngine::load通过QUrl。不能与QFile需要路径的构造函数一起使用。

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

scheme:[//host][/]path
Run Code Online (Sandbox Code Playgroud)

scheme:/path如果您跳过host一部分或scheme:///path指定host为空字符串,可能会导致这种情况。从RFC 3986

例如,定义了“文件” URI方案,因此没有权限,空主机和“ localhost”都表示最终用户的计算机,而“ http”方案则认为缺少权限或空主机无效。

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

有关完整的url语法,请参见此处