13

QWebViewにWebページをロードしています。そこで、JavaScriptでアプリケーションの関数を呼び出させたいと思います。その関数は、JavaScriptが動的に表示するいくつかの文字列を返します。

QWebViewを使用して実行できますか?基本的に、アプリケーション(C ++の場合)とQWebViewコントロールの間に何らかのブリッジを設けることは可能ですか?

4

1 に答える 1

14

これが私がやった方法です。メソッドを使用して、ヘッダーファイルで「JavaScriptBridge」クラスを宣言しましたQ_INVOKABLEQ_INVOKABLEメソッドはJavaScriptから呼び出すことができます。

class DictionaryJavaScriptBridge : public QObject {

    Q_OBJECT

public:

    DictionaryJavaScriptBridge(DictionaryWidget* dictionaryWidget); 
    Q_INVOKABLE QStringList sentences(QString characters);

private:

    DictionaryWidget* dictionaryWidget_;

};

次に、.cppファイルで、ブリッジを作成します。

jsBridge_ = new DictionaryJavaScriptBridge(this);

そして、私は信号を聞きjavaScriptWindowObjectClearedます。WebKitは新しいページをロードするときにすべてのJavaScriptオブジェクトをクリアするため、この手順は重要です。そのため、毎回ブリッジを追加し直す必要があります。

connect(ui->webView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(mainFrame_javaScriptWindowObjectCleared()));

最後に、javaScriptWindowObjectClearedスロットにJavaScriptブリッジを追加します。

void DictionaryWidget::mainFrame_javaScriptWindowObjectCleared() {
    ui->webView->page()->mainFrame()->addToJavaScriptWindowObject("ehbridge", jsBridge_);
}

JavaScriptから、グローバルな「ehbridge」オブジェクトが公開されます。通常のJavaScriptオブジェクトのようにそのメソッドを呼び出すことができます(QtはQtの型をJavaScript型に変換します)

var sentences = ehbridge.sentences("test");
于 2012-03-11T07:30:35.150 に答える