微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从 QML 访问 C++ 类中声明的 Q_ENUM?

如何解决如何从 QML 访问 C++ 类中声明的 Q_ENUM?

我在 Q_ENUM 中声明了一个 MyClass,如下所示:

class MyClass {
public:
    enum Enum_Test {
        eTestA,eTestB
    }
    Q_ENUM(Enum_Test)

    Q_OBJECT
    Q_PROPERTY(MyClass::Enum_Test enumTest READ GetEnumTest WRITE SetEnumTest )
}

我在 QML 端注册MyClass,如下所示并且能够访问它。

auto my_class = std::make_shared<MyClass>();
qmlRegisteruncreatableType<MyClass>("MyClass",1,"MyClass","Cannot create type MyClass in QML");
rootContext()->setContextProperty("my_class",my_class.get());

如何从 QML 访问 Q_ENUM Enum_Test

解决方法

您的课程需要进行两次调整。

  1. 正如JarMan所指出的,它需要一个metaObject,可以通过从QObject派生并添加Q_OBJECT来获得:

    class MyClass : public QObject
    {
        Q_Object
        ...
    }
    

    实际上,也可以使用 Q_GADGET,但您似乎已经倾向于使用 Q_OBJECT。但是,根据要求,我们开始:

    class MyClass { Q_GADGET

    public:
      enum Enum_Test {
          ETestA,ETestB
      }
      Q_ENUM(Enum_Test)
    

    };

    请记住 Q_GADGET cannot have signals,因此我忽略了该属性,只将此类作为“枚举占位符”。

  2. 枚举值名称需要大写:

    enum Enum_Test {
        ETestA,ETestB
    }
    Q_ENUM(Enum_Test)
    

然后你可以在 QML 中使用它:

     QtObject {
         property int myEnumVal: MyClass.ETestA
     }

请注意,由于与 JavaScript 的混合,对枚举的支持有所限制。这些值将被转换为整数。此外,当在 JavaScript 开关语句中使用时,QtCreator 不会警告错字(假设版本为 4.14)

,

@Amfasis 提供的答案已经很好了。由于我经常这样做,我写了一个小捷径来定义具有 Qt 提供的所有功能的枚举,包括 QML 中的可用性:https://github.com/carlonluca/lqtutils#lqtutils_enumh

您只需要包含标题,定义您的枚举值,如:

L_DECLARE_ENUM(Enum_Test,ETestA,ETestB
)

并在您喜欢的地方注册:

Enum_Test::qmlRegisterMySharedEnum("some.uri",1,0);

这也使用了简单的命名空间,这比使用 QObjects 或小工具要轻。

实际上,当我使用 Qt 时,我习惯于总是这样声明我的枚举,因为我也可以从 QMetaEnum 中受益。例如,我真的很喜欢能够像这样记录:

qDebug() << "Value:" << Enum_Test::ETestA;

得到:

Value: Enum_Test::ETestA

而不是简单的整数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。