2016-09-26 73 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