2

我有一组基于 QJSEngine 的 Qt 5 中暴露给 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?

4

1 回答 1

2

我发现了原始代码的问题:

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

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

于 2013-02-26T09:39:22.013 回答