2012年12月01日

Qt+JS: QtのクラスをJSから触れるようにする

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オブジェクトが返ってくる。
  • オーバーロードされているメソッド名が変わる点に注意。
posted by @shibukawa at 11:19 | Comment(141) | TrackBack(0) | 日記 はてなブックマーク - Qt+JS: QtのクラスをJSから触れるようにする
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/60465411
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
検索ボックス

Twitter

www.flickr.com
This is a Flickr badge showing public photos and videos from shibukawa.yoshiki. Make your own badge here.
<< 2019年02月 >>
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28    
最近の記事
カテゴリ
過去ログ
Powered by さくらのブログ