【问题标题】:How to access a Q_ENUM declared in C++ class from QML?如何从 QML 访问在 C++ 类中声明的 Q_ENUM?
【发布时间】:2021-03-29 13:30:11
【问题描述】:

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

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,0, "MyClass","Cannot create type MyClass in QML");
rootContext()->setContextProperty("my_class", my_class.get());

如何从 QML 访问 Q_ENUM Enum_Test

【问题讨论】:

  • 显示的代码不是你如何注册一个类,这是设置一个上下文属性。你需要qmlRegisterType,之后你可以做MyClass.TestA。枚举也必须以大写开头
  • 我更新了我的问题。如果我得到一个如何访问 Q_ENUM 的示例,这是我问题的主要观点,我可以负责正确注册课程。
  • MyClass 应该派生自 QObject。

标签: qt qml qt-quick qenum


【解决方案1】:

您的班级需要进行两次调整。

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

    class MyClass : public QObject
    {
        Q_Object
        ...
    }
    

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

    类 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)

【讨论】:

  • 谢谢。我正在接受这一点。展示基于Q_GADGET 的示例会很好,我可以接受。您介意使用Q_GADGET 编辑您的答案吗?
  • @TheWaterProgrammer 没问题,我加了
【解决方案2】:

@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

而不是简单的整数。

【讨论】:

  • 这太棒了!感谢您发布这个答案,即使在有一个被接受的情况下也是如此。
猜你喜欢
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多