如何在QWebView中获取Javascript来创建基于C++的类的新实例?

Pau*_*xon 6 javascript qt webkit qtwebkit

我已经使用addToJavaScriptWindowObject成功地将C++对象添加到QWebFrame,并且可以从javascript调用该对象上的插槽.

但我真正想做的是让其中一个插槽返回一个新对象.例如,我有一个这样的插槽,它返回一个QObject派生类实例:

   MyObject* MyApp::helloWorld()
   {
          //MyObject is dervied from QObject
          return new MyObject();
   }
Run Code Online (Sandbox Code Playgroud)

我可以像这样从javascript成功调用这个插槽

   var foo=myapp.helloWorld();
Run Code Online (Sandbox Code Playgroud)

但是foo似乎是空的,我不能通过Javascript调用任何插槽或访问它的任何属性.

有关如何实现这一目标的任何想法?

Pau*_*xon 3

我考虑过的一个相当丑陋的黑客方法是使用 addToJavaScriptWindowObject 将我想要返回的对象放入具有随机名称的窗口对象中,然后让我的插槽返回对象实例的名称:

QString MyApp::helloWorld()
{
     //general a unique name for the js variable
     QString name=getRandomVariableName();

     //here's the object we want to expose to js
     MyObject* pReturn=new MyObject();

     //we make attach our object to the js window object    
     getWebFrame()->addToJavaScriptWindowObject(name, pReturn,
         QScriptEngine::ScriptOwnership);  

     //tell js the name we used
     return name;
}
Run Code Online (Sandbox Code Playgroud)

可以编写JS来检查返回值是否是字符串,如果是,则从窗口中抓取对象:

var foo=myapp.helloWorld();
if (typeof foo == "string")
{
    foo=window[foo];
}
Run Code Online (Sandbox Code Playgroud)

有点难看,但在更好的方法出现之前我会坚持下去。未来的 Qt 版本将统一脚本支持,以便它全部基于 WebKit 中的 JavaScriptCore,所以希望这会有所改进!