2016-09-26 6 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.qmlQt documentationのように)に変更しても修正されません。それを:/main.qmlに変更すると、 "成功"という印字になります。

私は3つのフォームのそれぞれをいつ使用するのか混乱しています。

答えて

4

linkに記載されているように、:/main.qmlはファイルパスで、qrc:/main.qmlはURLです。

前者は、ファイルパスが必要な場所で使用することができます。QFileコンストラクタのように、基本的にはQStringです。

QQmlApplicationEngine::loadからQUrlのように、後者はURLが必要な場所で使用できます。パスが必要なコンストラクタQFileでは使用できません。

についてqrc:///、(クエリ、ユーザー/パスワード、またポートなし)単純化されたURL構文を使用できます

あなたが hostなどを指定する場合は host一部、または scheme:///pathをスキップする場合 scheme:/pathにつながることができます
scheme:[//host][/]path 

空の文字列例えば

は、「ファイル」無権限、空のホスト、および「localhost」をすべては、エンドユーザーのマシンを意味するように、URIスキームが定義されている、 "に対し:RFC 3986からhttpスキームは、欠落している権限または空のホストが無効であるとみなします。

qrcスキームを設計するときにQtの開発者がfileスキームのルールに従っているように見えます。結局のところ、ここのリソースは「エンドユーザのマシン上の」ファイル(実際には、エンドユーザのマシン上の実行可能ファイル内)です。だからqrc:/main.qmlqrc:///main.qmlは同じURLのちょうど2つの著作です。

完全なURL構文については、hereを参照してください。

+0

ありがとうございます。 'qrc:///'はどうですか? –

+0

@StefanMonov:ドキュメントリンクを参照してください: "[...]ファイルパス':/ images/cut.png'または** URL ** 'qrc:/// images/cut.png' [... ] "。基本的に: 'qrc:///' = URL。 – Pixelchemist

+0

@StefanMonov私は私の答えを編集;) – wasthishelpful