是否可以在QWebView中从JavaScript调用C ++函数?

时间:2012-03-08 09:15:54

标签: javascript c++ qt qwebview language-interoperability

我在QWebView中加载了一个网页。在那里,我想让JavaScript调用我的应用程序的功能。然后该函数将返回JavaScript将动态显示的一些字符串。

可以使用QWebView完成吗?基本上,是否可以在应用程序(在C ++中)和QWebView控件之间建立桥梁?

1 个答案:

答案 0 :(得分:14)

这就是我最终这样做的方式。我在头文件中用Q_INVOKABLE方法声明了一个“JavaScriptBridge”类。可以从JavaScript调用Q_INVOKABLE个方法:

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");