如何解决如何从 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
?
解决方法
您的课程需要进行两次调整。
-
正如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,因此我忽略了该属性,只将此类作为“枚举占位符”。
-
枚举值名称需要大写:
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 举报,一经查实,本站将立刻删除。