QtではJavaScriptを使ってコードを書くこともできます。詳しくはこちら参照。ベースはC++で、QtScriptエンジン(JavaScriptエンジン)を動かします。これはPureなECMAScriptのエンジンで、追加のコンポーネントとかは一切ないのですが、C++からクラスとか関数を登録できます。QtScriptBindingGeneratorで作ったバインディングを実際に使えるようにします。
なお、現在のQtScriptBindingGeneratorはQt4系にしか対応していません。Qt5はまだダメでした。
まず、QtScriptバインディングのファイルをplugins/scriptフォルダに置きます。ビルド時にこれらのファイルもデプロイされるようにプロジェクトファイルに追加します。
folder_01.source = js folder_01.target = . folder_02.source = plugins folder_02.target = . DEPLOYMENTFOLDERS = folder_01 folder_02
これらのバインディングを実行時に使えるようにするには、もろもろの設定をする必要があります。ちょっと長いですが、基本は「アプリケーションのsetLibraryPathsで作ったバインディングを読みこませる」「QScriptEngineでimportExtensionsして、Qtのクラスを登録する」の2点です。
QDir pluginDir(QApplication::applicationDirPath());
#ifdef Q_OS_MAC
pluginDir.cdUp();
pluginDir.cd("Resources");
#endif
if (!pluginDir.cd("plugins")) {
fprintf(stderr, "plugins folder does not exist -- did you build the bindings?\n");
return(-1);
}
QStringList paths = app.libraryPaths();
paths << pluginDir.absolutePath();
app.setLibraryPaths(paths);
QStringList extensions;
extensions << "qt.core"
<< "qt.gui"
<< "qt.xml"
<< "qt.svg"
<< "qt.network"
<< "qt.sql"
<< "qt.opengl"
<< "qt.webkit"
<< "qt.xmlpatterns"
<< "qt.uitools";
foreach (const QString &ext, extensions) {
QScriptValue ret = engine.importExtension(ext);
if (ret.isError())
{
qDebug() << "Error occured to load extionsion: " << ret.toVariant() << ext;
}
}
これで、QScriptEngineに渡すスクリプトファイルから、Qtの機能にアクセスすることができます。基本的にはC++のライブラリリファレンスを見てもらえばほぼそのまま使えるのですが注意点も少々あったりします。
- 使えないクラスもたまにある。ファイルシステムをツリービューで見せるコンポーネントとかなかった。
- QStringの代わりに素のJSの文字列が使える。
- QStringListとかは、素のJSの配列に文字列を入れて渡せば良い。
- 日付オブジェクトの代わりに、素のJSのDateオブジェクトが返ってくる。
- オーバーロードされているメソッド名が変わる点に注意。