有帮助吗?

解决方案

一个相当丑陋的黑客攻击,我认为是用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;
}

在JS可以写入,以检查是否返回值是一个字符串,并且如果是,则抓住从窗口对象:

var foo=myapp.helloWorld();
if (typeof foo == "string")
{
    foo=window[foo];
}

有一个难看一点,但会得到我,直到一个更好的方法走来。未来的Qt版本将会统一的脚本支持,使这一切都基于JavaScriptCore的WebKit中,所以希望这将改善呢!

其他提示

您可以将对象指针分配到一个QObject *和返回。

    QObject * obj = new MyObject();
    return obj;

这为我工作的Qt Webkit的端口上的Linux。

请返回新对象作为一个QObject *,而不是为MyObject *。如果你只是用QtScript工作,那么你可以调用 qScriptRegisterMetaType 定义一些代码,用于处理的为MyObject * s转换成QScriptValues(或QVariants),但似乎没有成为在QtWebKit的使用JavaScript引擎的等效。

烦人,这意味着暴露内部对象模型的WebKit将涉及要么有一个单独的一套转换你的对象指针的QObject * S,或者使用某种类型的适配器类做同样的事情代理功能。

这答案是根据保罗的回答,但有点简化。测试和Qt的5.3工作。你需要一个工厂,实例化一个对象,然后返回一个指针QObject这个对象。该对象的类必须从QObject继承,使其正常工作在JavaScript:

QObject * MyApp::createInstance(QString objname) {
    MyClass * obj = new MyClass(this);
    m_mainWindow->webView->page()->mainFrame()->addToJavaScriptWindowObject(objname, obj, QWebFrame::ScriptOwnership);
    return obj;
}

有了这个,你可以做以下从Javascript:

var myobject = MyApp.createInstance("obj1");

在这一点上,你已经obj1以及在全球的JavaScript命名空间myobject(他们只是指针,这样做既以下作品:

myobject.testmethod();
obj1.testmethod();

此时,可以使用在connect JavaScript来C ++信号连接到JavaScript的时隙。在这里该技术的更多信息: http://doc.qt.io/qt- 5 / QtWebKit的-bridge.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top