QTでJavaScriptを実行する方法

JavaScriptは実行環境さえあればどの環境でも実行できます。その特徴を生かしてQTでもJavaScriptを実行する環境が用意されています。

QTではQT Webkitという仕組みが用意されていてそれを使えばQObjectなどのネイティブなオブジェクトにもアクセスできます。その手順をここではまとまていきます。

プロジェクト設定

まず、JavaScriptを実行するにはプロジェクト設定にwebkitwidgetsを追加する必要があります。

QT       += core gui webkitwidgets

これでJavaScript実行に必要なQWebPageQWebFrameが使えるようになります。

手順

QObjectをJavaScriptから操作するにはQWebFrameaddToJavaScriptWindowFrameでオブジェクトを追加します。

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を実行する方法です。お疲れ様でした!

関連項目
プライバシーポリシー