Как зарегистрировать тип перечисления в QJSEngine для использования в среде сценариев?

Я искал несколько часов подряд, но не могу понять, как зарегистрировать тип перечисления со стороны 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);

};

Что мне нужно сделать, чтобы иметь возможность вызывать set() со стороны скрипта при использовании QJSEngine? Я пробовал закомментировать вызов Q_ENUM, но, похоже, это не помогает.


person Dago    schedule 14.01.2020    source источник


Ответы (1)


Верните Q_ENUM на место и добавьте это в конструктор:

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

Теперь вы можете использовать перечисление, например, например.

engine.evaluate("someClass.set(ScriptWrapper.Kek)");
person p-a-o-l-o    schedule 14.01.2020
comment
Это работает, спасибо! В конце концов, это было просто, они действительно могли прояснить этот раздел в документации Qt. - person Dago; 14.01.2020
comment
@Dago хорошо ... на самом деле это там: doc.qt.io/qt- 5/qjsengine.html#details. Прокрутите до Интеграция с QObject после кода: [...]значения enum класса доступны как свойства прокси-объекта. Действительно, немного скрыто. - person p-a-o-l-o; 14.01.2020