2012-03-08 65 views
12

我有一個網頁加載在一個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」 對象。我可以調用它的方法,像一個正常的JavaScript對象(QT Qt的類型轉換爲JavaScript類型)

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

是100%準確,Q_INVOKABLE只是創建了一個插槽,這樣你就可以動態調用任何類別的公共插槽。儘管如此,如果您使用Q_INVOKABLE,則該方法旨在用於從「外部」調用,但語義上可能更清晰。 – 2012-03-11 10:10:25

+1

+1用於每次在'javaScriptWindowObjectCleared'上重新建立橋接 – cod3monk3y 2013-04-16 18:00:59

相關問題