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