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

Posted

技术标签:

【中文标题】是否可以在 QWebView 中从 JavaScript 调用 C++ 函数?【英文标题】:Is it possible to call a C++ function from JavaScript in a QWebView? 【发布时间】:2012-03-08 09:15:54 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

这就是我最终做到的方式。我使用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");

【讨论】:

为了 100% 准确,Q_INVOKABLE 只是创建了一个插槽,因此您可以动态调用任何类的任何公共插槽。不过,如果您使用 Q_INVOKABLE 该方法旨在从“外部”调用,则语义上可能会更清楚。 +1 用于每次在javaScriptWindowObjectCleared上重新建立网桥

以上是关于是否可以在 QWebView 中从 JavaScript 调用 C++ 函数?的主要内容,如果未能解决你的问题,请参考以下文章

QWebView 类是不是在 Qt 5.0.0 中工作?

如何在Javascript中从数组中提取值

如何让 QWebView 释放线程?

QWebView,如何判断此链接是不是为新窗口?

将 QWebView 中的 Javascript 异常打印到控制台

替代 QWebView()