是否可以调用C++;QWebView中JavaScript的函数?

是否可以调用C++;QWebView中JavaScript的函数?,javascript,c++,qt,qwebview,language-interoperability,Javascript,C++,Qt,Qwebview,Language Interoperability,我在QWebView中加载了一个网页。在这里,我想让JavaScript调用我的应用程序的一个函数。然后,该函数将返回JavaScript将动态显示的一些字符串 可以使用QWebView完成吗?基本上,是否有可能在应用程序(用C++编写)和QWebView控件之间建立某种桥梁?这就是我最终如何做到的。我在头文件中用Q\u INVOKABLE方法声明了一个“JavaScriptBridge”类Q_可调用方法可以从JavaScript调用: class DictionaryJavaScriptBri

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


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

这就是我最终如何做到的。我在头文件中用
Q\u INVOKABLE
方法声明了一个“JavaScriptBridge”类<代码>Q_可调用方法可以从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类型)


为了100%准确,Q_INVOKABLE只创建了一个插槽,因此您可以动态调用任何类的任何公共插槽。不过,如果您使用Q_INVOKABLE,那么在语义上可能会更清楚,该方法是用于从“外部”调用的。+1用于每次在
javaScriptWindowObjectCleared
var sentences = ehbridge.sentences("test");