2013-02-25 146 views
2

我有一套C++类在Qt 5中基于QJSEngine(因为Qt脚本似乎已被弃用)暴露给javascript。自定义C++类型到QJSEngine:成员函数返回值始终是QVariant

我的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 

有没有办法,我保证,而不是说的QVariant中的getParent的JavaScript被确认为实际类型的对象,?

回答

2

我想通了,这些问题与我的原代码:

  1. 使用Qt插槽返回值可能不是在一般情况下是一个好主意(见例如Qt: meaning of slot return value?)。我将函数改为Q_INVOKABLE,但实际上并没有改变结果,但它似乎是一个更安全的地方。
  2. 按值返回对于脚本/包装也不是一个好主意。用调试器挖掘代码我发现QVariant转换为qobject失败,并且使灯泡熄灭:by-value可能会破坏尝试查找QObject派生类型的qobject_cast。我改变了调用返回一个指向QObject的指针,现在QJSEngine将该对象报告为正确的类型。

这需要对我的代码设置进行一些更改,因为返回值曾经是临时的,但我可以忍受。

+0

你有没有机会分享如何用QJSEngine创建“新”对象?我现在正在努力。我发现的所有文档都是用旧引擎进行描述的 – Jay 2015-02-23 19:08:03

相关问题