序言
概念
QML的枚举和C++的其实差不多,但是呢,局限比较多,首先不能在main.qml里定义,也不能在子项中定义。
解释:
main.qml的根节点定义枚举,没法用main.或者Main.- 子项中定义,比如说
Rectangle里的Text,你没法寻到此处的枚举,直接Text.也不合适,Text本身没有定义你自定义的枚举,你是调用不了的
只允许两种定义方法,一种是自定义控件里的根节点定义,另一种是通过C++的Q_ENUM定义。
注:以上非绝对,只是自己的经验总结,可能只是暂时没遇到正确方法
命名规则
枚举要想在QML里用,命名需要满足两个条件:
1.枚举名首字母必须是大写,不大写的话也会编译不过:
enum rectType { //编译不过
...
enum RectType { //编译通过

- 枚举项首字母也必须是大写:
enum RectType {
enum1, // 编译不过
Enum2, // 编译通过

以上是QML会编译出错,但是要想在QML里用,C++也要遵守
在QML定义枚举的规范
与C++相比,枚举项的末项不能有,,末尾的}后也无需;
enum RectType {
Rect1 = 1,
Rect2,
Rect3, //编译出错,不能加,
}
另外,第一个枚举一定要设 = 1,这是因为QML中存在某些情况用到了第一个枚举是0的,会被判断为null,从而设置为第一个枚举失败,无论C++的枚举还是QML的枚举。
用法
QML的枚举定义方法
如概念说的,在自定义组件中的根节点定义枚举。
如果有属性获取的话,可以用int或者var承载
testRect.qml
...
Rectangle {
...
enum RectType {
Rect1 = 1,
Rect2,
Rect3
}
//property int rectT: TestRect.Rect1 //有时可以,有时会是undefined
property int rectT: TestRect.RectType.Rect1
...
}
调用方法:[自定义组件名(首字母大写)].[枚举名].[枚举项]
供QML调用的,C++的枚举定义方法
具体怎么QML调用C++的过程省略,这不是本节重点
C++定义需要遵守,枚举名首字母大写,枚举项大写的规则
class TestRect ...
...
public:
enum RectType {
Rect1 = 1,
Rect2,
Rect3,
};
Q_ENUM(RectType)
...
...
console.log(TestRect.Rect2)
调用方法:
- [自定义组件名(首字母大写)]
.[枚举项] - [自定义组件名(首字母大写)]
.[枚举名].[枚举项]
注意:
- 如果不是用enum,而是用enum class,那么调用方法就强制只能中间有枚举名,但是有些版本又可以不用中间的枚举名,直接访问,具体效果自行试验自己用的版本。
调用方法:[自定义组件名(首字母大写)].[枚举名].[枚举项]
console.log(TestRect.RectType.Rect3)
- 供QML用的C++枚举不能用低于int的枚举的底层类型(underlying type),如果用char/unsigned char/short/unsigned short等,在QML上打印会是乱码,无法实际对应
enum RectType : unsigned char
console.log(TestRect.RectType.Rect3) // 49266178
- C++注册元属性枚举,不能用全命名空间注册,要只用枚举名注册
enum RectType {
Rect1 = 1,
Rect2,
Rect3,
};
Q_ENUM(RectType) // 通过
Q_ENUM(TestRect::RectType) // 注册失败,会是undefined property type
本文介绍了QML和C++中枚举的定义与使用。QML枚举局限较多,只能在自定义控件根节点或通过C++的Q_ENUM定义。阐述了QML枚举命名规则、定义规范,还分别说明了QML和供QML调用的C++枚举定义方法及调用方式。

823

被折叠的 条评论
为什么被折叠?



