アプリケーションをスクリプト化する
Qt では JavaScript を使ったアプリケーションのスクリプティングをサポートしています。以下のガイドとリファレンスは、JavaScript と Qt を使ったプログラミングの側面をカバーしています。
スクリプトクラス
以下のクラスは Qt アプリケーションにスクリプト機能を追加します。
JavaScript コードの評価環境 | |
JavaScript のセマンティクスでプリミティブ型を操作する | |
Qt/JavaScript データ型のコンテナとして動作する | |
QJSValue用のJavaスタイルのイテレータ |
基本的な使い方
スクリプトコードを評価するには、QJSEngine を作成し、評価するスクリプトコード(テキスト)を引数として渡して evaluate() 関数を呼び出します。
戻り値は評価結果(QJSValue オブジェクトとして表現されます)です。これは標準的な C++ や Qt の型に変換することができます。
カスタムプロパティは、スクリプトエンジンに登録することで、スクリプトで利用できるようになります。これは、スクリプトエンジンのグローバルオブジェクトのプロパティを設定することによって、最も簡単に行うことができます:
engine.globalObject().setProperty("foo", 123); qDebug() << "foo times two is:" << engine.evaluate("foo * 2").toNumber();
これにより、プロパティがスクリプト環境に配置され、スクリプト・コードから利用できるようになります。
QObjectをスクリプトエンジンで使用可能にする
QObject ベースのインスタンスは、スクリプトで使用できるようにすることができます。
QObject をQJSEngine::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.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。