13

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

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

4

1 回答 1

14

这就是我最终做到的方式。我在我的头文件中用一个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");
于 2012-03-11T07:30:35.150 回答