我有一個網頁加載在一個QWebView。在那裏,我想讓JavaScript調用我的應用程序的功能。該函數然後會返回一些JavaScript可以動態顯示的字符串。是否可以在QWebView中調用JavaScript中的C++函數?
可以使用QWebView完成嗎?基本上,應用程序(使用C++)和QWebView控件之間是否可以有橋樑?
我有一個網頁加載在一個QWebView。在那裏,我想讓JavaScript調用我的應用程序的功能。該函數然後會返回一些JavaScript可以動態顯示的字符串。是否可以在QWebView中調用JavaScript中的C++函數?
可以使用QWebView完成嗎?基本上,應用程序(使用C++)和QWebView控件之間是否可以有橋樑?
這就是我最終這樣做的結果。我在頭文件中用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」 對象。我可以調用它的方法,像一個正常的JavaScript對象(QT Qt的類型轉換爲JavaScript類型)
var sentences = ehbridge.sentences("test");
是100%準確,Q_INVOKABLE只是創建了一個插槽,這樣你就可以動態調用任何類別的公共插槽。儘管如此,如果您使用Q_INVOKABLE,則該方法旨在用於從「外部」調用,但語義上可能更清晰。 – 2012-03-11 10:10:25
+1用於每次在'javaScriptWindowObjectCleared'上重新建立橋接 – cod3monk3y 2013-04-16 18:00:59