【问题标题】:Custom C++ type to QJSEngine: member function return value is always QVariant自定义 C++ 类型到 QJSEngine:成员函数返回值始终是 QVariant
【发布时间】:2013-02-25 16:59:39
【问题描述】:

我在 Qt 5 中有一组 C++ 类暴露给 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?

【问题讨论】:

    标签: javascript qt5 qjsengine


    【解决方案1】:

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

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

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

    【讨论】:

    • 您有没有机会分享您如何使用 QJSEngine 创建“新”对象?我现在正在为此苦苦挣扎。我找到的所有文档都描述了使用旧引擎进行此操作
    猜你喜欢
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2014-11-24
    • 1970-01-01
    • 2016-04-15
    相关资源
    最近更新 更多