我有一组C++类在Qt 5中公开给javascript,基于QJSEngine(因为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?
我发现了原始代码的问题:
- 在一般情况下,使用带有返回值的Qt插槽可能不是一个好主意(例如,请参见Qt:插槽返回值的含义?(。我将函数改为Q_INVOKABLE,这实际上并没有改变结果,但它似乎是一个更安全的地方
- 按值返回对于脚本编写/包装来说似乎也不是一个好主意。通过使用调试器挖掘代码,我发现QVariant转换到qobject失败,导致灯泡熄灭:按值计算,可能会破坏试图查找qobject派生类型的qobject_cast。我更改了调用以返回指向QObject的指针,现在QJSEngine将对象报告为正确的类型
这需要对我的代码设置进行一些更改,因为返回的值过去是临时的,但我可以接受。