自定义C ++类型为QJSEngine:成员函数返回值始终为QVariant

时间:2013-02-25 16:59:39

标签: javascript qt5 qjsengine

我在Qt 5中有一组基于QJSEngine暴露给javascript的C ++类(因为Qt脚本似乎已被弃用)。

我的QObject派生类A和B具有Q_OBJECT宏并且也使用Q_DECLARE_METATYPE宏。

我已经为我的类公开了工厂函数,允许我从javascript内部创建新实例。以下所有工作正常:

a = namespace.createNewA(); // QJSEngine reports a type A object
b = namespace.createNewB(); // QJSEngine reports a type B object
b.SetParent(a); // SetParent is a slot of B taking a const A& parameter, gets called correctly
// But now.
b.GetParent(); // Reports QVariant(A), even though this is a slot: A GetParent() const

有没有办法让我确保javascript中的GetParent被识别为实际类型A对象,而不是QVariant?

1 个答案:

答案 0 :(得分:2)

我找出了原始代码的问题:

  1. 在一般情况下,使用带有返回值的Qt槽可能不是一个好主意(参见例如Qt: meaning of slot return value?)。我将函数更改为Q_INVOKABLE,它实际上没有改变结果,但它似乎是一个更安全的地方继续。
  2. 按值返回对于脚本/包装似乎也不是一个好主意。使用调试器挖掘代码我发现QVariant cast-to-qobject失败了,这使得灯泡关闭:by-value可能会破坏试图查找QObject派生类型的qobject_cast。我更改了调用以返回指向QObject的指针,现在QJSEngine将对象报告为正确的类型。
  3. 这需要对我的代码设置进行一些更改,因为返回的值过去是暂时的,但我可以忍受。