QTでJavaScriptを実行する方法
JavaScriptは実行環境さえあればどの環境でも実行できます。その特徴を生かしてQTでもJavaScriptを実行する環境が用意されています。
QTではQT Webkitという仕組みが用意されていてそれを使えばQObjectなどのネイティブなオブジェクトにもアクセスできます。その手順をここではまとまていきます。
プロジェクト設定
まず、JavaScriptを実行するにはプロジェクト設定にwebkitwidgetsを追加する必要があります。
QT += core gui webkitwidgets
これでJavaScript実行に必要なQWebPageとQWebFrameが使えるようになります。
手順
QObjectをJavaScriptから操作するにはQWebFrameにaddToJavaScriptWindowFrameでオブジェクトを追加します。
QWebPage webPage;
QWebFrame * webFrame = webPage.mainFrame();
webFrame->addToJavaScriptWindowObject("QObj", obj);
この場合、objというオブジェクトはJavaScript内で"QObj"という名前でアクセスできるようになります。
その後、QWebFrameにJavaScriptを渡すことでスクリプトが実行できます。
webFrame->setHtml("スクリプト...");
JavaScript内でQObjectのシグナルやスロットを結びつける場合、次のようにconnect関数を利用します。
JavaScript内QObj.signalFunction.connect(slotFunction);
connectはシグナル関数オブジェクトが共通に持っている関数で引数にはスロット関数を渡します。
実行例
例としてJavaScriptを内部で実行するウィジェットを作ってみます。
次がヘッダーです。
#ifndef JSWIDGET_H #define JSWIDGET_H #include <QWidget> #include <QWebPage> #include <QWebFrame> class JSWidget : public QWidget { Q_OBJECT public: explicit JSWidget(QWidget *parent = 0); ~JSWidget(); signals: void connectRequested(); public slots: void showMessage(); private: QWebPage webPage; }; #endif // JSWIDGET_H
シグナルとスロットが1つずつ宣言されていますが、これがJavaScriptから参照される関数です。
そして次がJSWidgetの定義です。
JSWidget::JSWidget(QWidget * parent) : QWidget(parent) { QWebFrame * frame = webPage.mainFrame(); frame->addToJavaScriptWindowObject("QObj", this); webPage.mainFrame()->setHtml( "<script>" " QObj.connectRequested.connect(QObj.showMessage);" "</script>"); emit connectRequested(); } void JSWidget::showMessage() { qDebug() << "Called from Javascript."; } JSWidget::~JSWidget(){}
シグナルとスロットを結びつけているのが次のスクリプトコードです。
QObj.connectRequested.connect(QObj.showMessage);
これでconnectRequestedが発信されるとshowMessageが実行されるようになります。
以上がQT上でJavaScriptを実行する方法です。お疲れ様でした!