如何获取JavaScript在QWebView创建的基于C ++的类的新实例?
-
09-09-2019 - |
题
我已经成功地增加了一个C ++对象到QWebFrame与 addToJavaScriptWindowObject 一>, 并且可以从JavaScript调用该对象上的狭槽。
但我真正想要做的是有这些插槽的一个返回一个新的对象。例如,我有这样的槽,它返回一个QObject派生类实例:
MyObject* MyApp::helloWorld()
{
//MyObject is dervied from QObject
return new MyObject();
}
我可以通过从JavaScript成功这样调用此槽
var foo=myapp.helloWorld();
但是FOO显示为空,我不能调用任何槽或访问任何 从Javascript上它的性质。
我如何能做到这一点任何想法?
解决方案
一个相当丑陋的黑客攻击,我认为是用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。
QtScript具有原型的概念 - 这允许创建一个C ++原型脚本值。我们正在调查羯羊我们可以JavaScriptCore的桥梁QtScript - 其中的应该的导致使用从WebKit的JavaScript环境以及原型的可能性; http://doc.trolltech.com/ 4.5 / qtscript.html#制作 - 使用 - 的原型基于继承
请返回新对象作为一个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