6

我尝试将对象作为全局属性公开给具有以下方法的 Java Script:

Q_INVOKABLE MyObject* createMyObject();

MyObject 派生自 QObject。

当我在 Java Script 中调用此方法时,它返回一个类型的对象:

QVariant(MyObject*)

我想知道是否可以自动将其转换为 QJSValue 以便我可以在脚本中进一步使用它?

4

4 回答 4

4

似乎 Java Script 使用 QVariant 作为任何“未知”类型的不透明包装器。该值可以很容易地传递,但不能使用它的任何属性,也不能调用它的任何方法。要在脚本中使用,它应该转换为 QJSValue。我发现的唯一方法是像这样声明辅助函数:

Q_INVOKABLE QJSValue convert(QVariant var)
{
    return _engine.newQObject(var.value<QObject*>());
}

那么可以将 QVariant 转换为 QJSValue:

var obj = convert(createMyObject());

并且 obj 将是类型

MyObject

所以现在它可以在脚本中使用。

于 2013-01-21T13:15:14.967 回答
3

所有需要做的就是在脚本中引用MyObject之前在某处调用下面的方法。

qmlRegisterType<MyObject>("", 1, 0, "MyObject");

然后createMyObject方法将返回正确的类型,无需任何转换:

var obj = createMyObject();

MyObject

实际上如果我们改变下面方法的类型

Q_INVOKABLE MyObject* createMyObject();

Q_INVOKABLE QObject* createMyObject();

即使没有它也会开始工作

qmlRegisterType
于 2013-02-26T13:41:41.893 回答
2

你可以使用QJSEngine::newQObject()方法。

使用newQObject()来包装QObject(或子类)指针。newQObject()返回一个代理脚本对象;QObject的属性、子项以及信号和槽可用作代理对象的属性。不需要绑定代码,因为它是使用 Qt 元对象系统动态完成的。

请在QJSEngine 类:QObject 集成中阅读更多详细信息。

于 2013-01-19T08:36:53.283 回答
0

我处于类似情况,尝试使用 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*))?

于 2013-07-02T16:58:24.500 回答