我尝试将对象作为全局属性公开给具有以下方法的 Java Script:
Q_INVOKABLE MyObject* createMyObject();
MyObject 派生自 QObject。
当我在 Java Script 中调用此方法时,它返回一个类型的对象:
QVariant(MyObject*)
我想知道是否可以自动将其转换为 QJSValue 以便我可以在脚本中进一步使用它?
我尝试将对象作为全局属性公开给具有以下方法的 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*))?