2013-04-07 73 views
3

我正在使用QWebView并调用setHtml()来显示一些HTML/JavaScript页面。我使用QWebFrame :: evaluateJavaScript通过传递包含对JavaScript函数(带参数)的调用的QString来传递数据更新。在阅读了关于Qt WebKit Bridge之后,我觉得应该有更好的方式来做他的工作。我看到有关将C++中的Qt对象/函数暴露给JavaScript的讨论,但没有涉及到其他方向。 (我不希望JavaScript来轮询C++端的更新。)有没有将JavaScript函数作为插槽连接到Qt/C++信号的方法? (或者类似的模式)我觉得我已经浏览了很多文档,发布了问题(即使是我输入的“类似问题”),但没有看到这方面的例子。欣赏任何信息,链接或向正确的方向推动。Qt Webkit Bridge:C++访问JavaScript

+0

什么,具体是你想要做什么?推C++ >> JS或相反? – amwinter 2013-05-18 11:02:46

回答

2

使用addToJavaScriptWindow对象暴露你的C++对象的JavaScript层:

page()->mainFrame()->addToJavaScriptWindowObject(QString("myObject"), myObject); 

检查文档在这里: http://qt-project.org/doc/qt-4.8/qwebframe.html#addToJavaScriptWindowObject

,将暴露你的C++ myObject的是 “myObject的”。

然后,你可以做的正是你所期待的在您的文章,让我们假设myObject的声明以下列方式的信号:

信号:

mySignal(QString aParameter); 

您可以在信号简单地连接到您的网页上的插槽如下:

myObject.mySignal.connect(this,this.mySignalSlot);

在这种情况下,mySignalSlot应该比在C++类侧mySignal声明相同的签名(当然,“相同的签名”将意味着相同数量的参数,如JavaScript没有类型,所以你不会需要为每个人声明一个类型)。

这里真正有用的是传递JSon对象。如果你需要传递大量的数据,你可以使用base64编码。对于图像,QTWebKit支持本地QImage和QPixmap类;最后两个是通过QTWebKit Bridge引擎原生编码为复杂的JavaScript对象。