2016-09-26 1 views
3

Dieser Code folgt:Unterschied zwischen `:/foo`,` qrc:/foo` und `qrc: /// foo` Pfade in Qt

QQmlApplicationEngine engine; 
engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 

Dieser Code druckt "Fehler":

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

Das Ändern des QFile-Konstruktorarguments auf qrc:///main.qml (wie in Qt documentation) behebt es nicht. Ändern Sie es zu :/main.qml macht es "Erfolg" obwohl drucken.

So bin ich verwirrt, wann zu jeder der 3 Formen zu verwenden.

Antwort

4

Wie in Ihrer link, :/main.qml ist ein Dateipfad angegeben, während qrc:/main.qml eine URL ist.

Die erste kann verwendet werden, wo ein Dateipfad erforderlich ist - im Grunde ein QString, wie mit QFile Konstruktor.

Letzteres kann verwendet werden, wenn eine URL erforderlich ist, z. B. mit QQmlApplicationEngine::load bis QUrl. Es kann nicht mit QFile Konstruktor verwendet werden, wo ein Pfad benötigt wird.

Über qrc:///, eine vereinfachte URL-Syntax (ohne Abfrage Benutzer/Passwort, noch Port) können sein:

scheme:[//host][/]path 

die zu scheme:/path führen kann, wenn Sie host Teil überspringen oder scheme:///path wenn Sie angeben host als eine leere Zeichenfolge. Von RFC 3986:

Zum Beispiel das „Datei“ URI-Schema ist so definiert, dass keine Autorität, eine leere Host und „localhost“ alle bedeutet die Endbenutzers Maschine, während der " Das HTTP-Schema betrachtet eine fehlende Autorität oder einen leeren Host als ungültig.

Sieht aus wie Qt-Entwickler, die Regeln des file Schema gefolgt, wenn ihre qrc Schema zu entwerfen. Schließlich sind die Ressourcen hier nur Dateien "auf dem Computer des Endbenutzers" (tatsächlich in einer ausführbaren Datei auf dem Computer des Endbenutzers). So sind qrc:/main.qml und qrc:///main.qml nur zwei Schriften derselben URL.

Siehe here für vollständige URL-Syntax.

+0

Danke, und was ist mit 'qrc: ///'? –

+0

@StefanMonov: Siehe den Dokumentationslink: "[...] der Dateipfad':/images/cut.png' oder die ** URL ** 'qrc: /// images/cut.png' [... ] ". Grundsätzlich: 'qrc: ///' = URL. – Pixelchemist

+0

@StefanMonov Ich habe meine Antwort bearbeitet;) – wasthishelpful

Verwandte Themen