如何将枚举类型注册到 QJSEngine 以从脚本环境中使用?

Posted

技术标签:

【中文标题】如何将枚举类型注册到 QJSEngine 以从脚本环境中使用?【英文标题】:How to register an enum type to QJSEngine to be used from the scripting environment? 【发布时间】:2020-01-14 07:02:09 【问题描述】:

我已经连续搜索了几个小时,但我不知道如何从 C++ 端注册枚举类型,以便在使用 QJSEngine 时从脚本环境端使用它?

我有一个派生自 QObject 的类,已注册到脚本环境,并且有一个将枚举作为参数的函数。我希望能够从脚本环境中调用该函数。

class ScriptWrapper : public QObject

    Q_OBJECT

  public:
    ScriptWrapper(QJSEngine& engine)
    
        QJSValue scriptVal = engine.newQObject(this);
        engine.globalObject().setProperty("someClass", scriptVal);
    

    enum class Foo
    
        Bar,
        Kek
    ;
    // Q_ENUM(Foo)

    Q_INVOKABLE void set(Foo foo);

;

在使用 QJSEngine 时,我需要做什么才能从脚本端调用 set()?我已尝试将 Q_ENUM 调用注释掉,但它似乎没有帮助。

【问题讨论】:

【参考方案1】:

Q_ENUM 放回原处并将其添加到构造函数中:

QJSValue meta = engine.newQMetaObject(&ScriptWrapper::staticMetaObject);
engine.globalObject().setProperty("ScriptWrapper", meta);

现在你可以像这样使用枚举了,例如

engine.evaluate("someClass.set(ScriptWrapper.Kek)");

【讨论】:

这行得通,谢谢!毕竟很简单,他们可以在 Qt 文档中真正阐明这部分内容。 @Dago 好吧......实际上它就在那里:doc.qt.io/qt-5/qjsengine.html#details。滚动到 QObject Integration,在代码之后:[...]类的枚举值可用作代理对象的属性。确实有点隐藏。

以上是关于如何将枚举类型注册到 QJSEngine 以从脚本环境中使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何清理或销毁 QJSEngine?

如何从 Qt 5.12 中的 QJSEngine 获取标准输出?

QJSEngine 评估结果不包含函数

QJSEngine 删除我的 QObject,如何在 QJSEngine::newQObject 之后更改所有权?

如何使用 QJSEngine 构建 API?

QJSEngine,全局和脚本,是啥导致语法错误