我尝试将一个对象作为一个全局属性暴露给Java Script,它有以下方法:
Q_INVOKABLE MyObject* createMyObject();
MyObject派生自QObject。
当我在Java Script中调用这个方法时,它返回一个类型为:
的对象QVariant(MyObject*)
我想知道是否有可能自动将其转换为QJSValue,以便我可以在脚本中进一步使用它?
似乎Java Script使用QVariant作为任何"未知"类型的不透明包装。这个值可以很容易地传递,但是不能使用它的任何属性,也不能调用它的任何方法。要在脚本中使用,应该将其转换为QJSValue。我发现的唯一方法是像这样声明辅助函数:
Q_INVOKABLE QJSValue convert(QVariant var)
{
return _engine.newQObject(var.value<QObject*>());
}
则可以将QVariant转换为QJSValue:
var obj = convert(createMyObject());
和obj的类型为
MyObject
所需要做的就是在脚本中引用MyObject之前调用下面的方法。
qmlRegisterType<MyObject>("", 1, 0, "MyObject");
那么createMyObject方法将返回正确的类型,而不需要任何转换:
var obj = createMyObject();
MyObject
实际上如果我们改变下面方法的类型
Q_INVOKABLE MyObject* createMyObject();
Q_INVOKABLE QObject* createMyObject();
即使没有
,它也会开始工作qmlRegisterType
您可以使用QJSEngine::newQObject()
方法。
使用newQObject()包装一个QObject(或子类)指针。newQObject()返回代理脚本对象;QObject的属性、子属性、信号和槽都可以作为代理对象的属性使用。不需要绑定代码,因为它是使用Qt元对象系统动态完成的。
请在QJSEngine类:QObject集成中阅读更多细节。
我处于类似的情况,试图使用QJSEngine编写脚本(目前卡在试图将QList暴露给QJSEngine…)
我认为将现有的c++对象暴露给脚本的最简单的方法是:
//create c++ file object
MyObject* anObject = new MyObject();
//make c++ object available to script
QJSValue scriptObject = myEngine.newQObject(anObject);
myEngine.globalObject().setProperty("obj", scriptObject);
你现在应该可以从脚本中访问"obj"了。
顺便说一下,如何找出脚本(QVariant(MyObject*))的类型?