2012-03-08 9 views
12

WebページがQWebViewに読み込まれています。そこでは、JavaScriptをアプリケーションの関数として呼びたいと思います。その関数はJavaScriptが動的に表示するいくつかの文字列を返します。QWebViewでJavaScriptからC++関数を呼び出すことはできますか?

QWebViewを使用するとできますか?基本的には、アプリケーション(C++)とQWebViewコントロールの間にブリッジを置くことは可能ですか?

答えて

13

これが私のやり方です。私はQ_INVOKABLEメソッドを使ってヘッダファイルに "JavaScriptBridge"クラスを宣言しました。 Q_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"オブジェクトが公開されます。私はQ_INVOKABLEがちょうどスロットを作成するので、あなたは、動的に任意のクラスの任意のパブリックスロットを呼び出すことができ、100%正確であるためには、通常のJavaScriptオブジェクトのようにそのメソッド(QtはJavaScriptのタイプにQtの種類を変換)

var sentences = ehbridge.sentences("test"); 
+1

を呼び出すことができます。それでも、Q_INVOKABLEを使用してメソッドが "外部"からの呼び出しを意図している場合、意味的にはより明確になる可能性があります。 –

+1

「javaScriptWindowObjectCleared'で毎回ブリッジを再確立するために+1 – cod3monk3y

関連する問題