2016-09-26 64 views
3
/// foo`路径

此代码成功:差异Qt中

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可以打印“成功”。

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

回答

4

正如您的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

例如,“文件” URI方案的定义,使没有权威,空主机,和“localhost”的所有意味着最终用户的机器,而“ http“方案认为缺少权限或空主机无效。

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

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

+0

谢谢,'qrc:///'怎么样? –

+0

@StefanMonov:查看你的文档链接:“[...]文件路径':/ images/cut.png'或** URL **'qrc:/// images/cut.png' [... ]”。基本上:'qrc:///'= URL。 – Pixelchemist

+0

@StefanMonov我编辑了我的答案;) – wasthishelpful