アプリケーションをスクリプト化する

Qt では JavaScript を使ったアプリケーションのスクリプティングをサポートしています。以下のガイドとリファレンスは、JavaScript と Qt を使ったプログラミングの側面をカバーしています。

スクリプトクラス

以下のクラスは Qt アプリケーションにスクリプト機能を追加します。

QJSEngine

JavaScript コードの評価環境

QJSPrimitiveValue

JavaScript のセマンティクスでプリミティブ型を操作する

QJSValue

Qt/JavaScript データ型のコンテナとして動作する

QJSValueIterator

QJSValue用のJavaスタイルのイテレータ

基本的な使い方

スクリプトコードを評価するには、QJSEngine を作成し、評価するスクリプトコード(テキスト)を引数として渡して evaluate() 関数を呼び出します。

QJSEngine engine;
qDebug() << "the magic number is:" << engine.evaluate("1 + 2").toNumber();

戻り値は評価結果(QJSValue オブジェクトとして表現されます)です。これは標準的な C++ や Qt の型に変換することができます。

カスタムプロパティは、スクリプトエンジンに登録することで、スクリプトで利用できるようになります。これは、スクリプトエンジンのグローバルオブジェクトのプロパティを設定することによって、最も簡単に行うことができます:

engine.globalObject().setProperty("foo", 123);
qDebug() << "foo times two is:" << engine.evaluate("foo * 2").toNumber();

これにより、プロパティがスクリプト環境に配置され、スクリプト・コードから利用できるようになります。

QObjectをスクリプトエンジンで使用可能にする

QObject ベースのインスタンスは、スクリプトで使用できるようにすることができます。

QObjectQJSEngine::newQObject() 関数に渡すと、QObject のシグナル、スロット、プロパティ、子オブジェクトをスクリプトで利用できるようにするための Qt Script ラッパーオブジェクトが作成されます。

ここでは、QObject のサブクラスのインスタンスを、"myObject" という名前でスクリプトコードから利用できるようにする例を示します:

QJSEngine engine;
QObject *someObject = new MyObject;
QJSValue objectValue = engine.newQObject(someObject);
engine.globalObject().setProperty("myObject", objectValue);

これは、スクリプト環境にmyObject というグローバル変数を作成します。この変数は、基礎となる C++ オブジェクトへのプロキシとして機能します。スクリプト変数の名前は何でもよいことに注意してください。つまり、QObject::objectName() に依存するものではありません。

アプリケーション・セキュリティへの影響

JavaScriptによるアプリケーションのスクリプティングのセキュリティモデルは、C++コードと同じモデルに従います:ユーザーは、Qtアプリケーションをインストールするのと同じように、信頼できるスクリプトをインストールして実行します。

ユーザーの信頼を維持するために、アプリケーション開発者は任意のJavaScriptコードを評価すべきではありません。JavaScriptエンジンのサンドボックスは意味的な障壁に過ぎません。スクリプトはアプリケーションの残りの部分と同じプロセス、同じ権限で評価され、同じメモリを共有します。その結果、スクリプトにさらされる C++ オブジェクトは、追加のセキュリティ・ガードなしでアクセスできます。

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