2016-09-26 2 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으로 변경하면 "성공"으로 인쇄됩니다.

그래서 나는 각각의 3 가지 형태를 언제 사용하는지 혼란 스럽습니다.

답변

4

link에 명시된 것처럼 :/main.qml은 파일 경로이고 qrc:/main.qml은 URL입니다.

전자는 QFile 생성자와 같이 파일 경로가 필요한 곳에서 사용할 수 있습니다. 기본적으로 QString입니다.

후자는 QQmlApplicationEngine::load에서 QUrl과 같이 URL이 필요한 곳에서 사용할 수 있습니다. 경로가 필요한 곳에서는 QFile 생성자와 함께 사용할 수 없습니다.

소개 qrc:///, 단순화 된 URL 구문 (쿼리하지 않고, 사용자/암호, 나 포트)가 될 수 있습니다 당신이로 host를 지정하면 scheme:/path로 이어질 수

scheme:[//host][/]path 

당신이 host 부분, 또는 scheme:///path를 건너 뛸 경우 빈 문자열 RFC 3986에서 예를 들면 다음과 같습니다

, "파일"URI 방식이 정의된다 때문에 반면에 어떤 권한없는 에게 빈 호스트하고 "localhost"를 모든 는 최종 사용자의 컴퓨터 의미는 " http "체계는 누락 된 권한 또는 빈 호스트가 유효하지 않은 것으로 간주합니다.

qrc 구성표를 디자인 할 때 Qt의 개발자가 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