Qt 5.0:将c++方法暴露给Java Script



我尝试将一个对象作为一个全局属性暴露给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*))的类型?

相关内容

  • 没有找到相关文章

最新更新