QWebViewにWebページをロードしています。そこで、JavaScriptでアプリケーションの関数を呼び出させたいと思います。その関数は、JavaScriptが動的に表示するいくつかの文字列を返します。
QWebViewを使用して実行できますか?基本的に、アプリケーション(C ++の場合)とQWebViewコントロールの間に何らかのブリッジを設けることは可能ですか?
QWebViewにWebページをロードしています。そこで、JavaScriptでアプリケーションの関数を呼び出させたいと思います。その関数は、JavaScriptが動的に表示するいくつかの文字列を返します。
QWebViewを使用して実行できますか?基本的に、アプリケーション(C ++の場合)とQWebViewコントロールの間に何らかのブリッジを設けることは可能ですか?
これが私がやった方法です。メソッドを使用して、ヘッダーファイルで「JavaScriptBridge」クラスを宣言しましたQ_INVOKABLE
。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」オブジェクトが公開されます。通常のJavaScriptオブジェクトのようにそのメソッドを呼び出すことができます(QtはQtの型をJavaScript型に変換します)
var sentences = ehbridge.sentences("test");