我在QWebView中加载了一个网页。在那里,我想让JavaScript调用我的应用程序的功能。然后该函数将返回JavaScript将动态显示的一些字符串。
可以使用QWebView完成吗?基本上,是否可以在应用程序(在C ++中)和QWebView控件之间建立桥梁?
答案 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");