QML的枚举用法
- 序言
- 概念
- 命名规则
- 在QML定义枚举的规范
- 用法
- QML的枚举定义方法
- 供QML调用的,C++的枚举定义方法
序言
概念
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,
Rect2,
Rect3, //编译出错,不能加,
}
用法
QML的枚举定义方法
如概念说的,在自定义组件中的根节点定义枚举。
如果有属性获取的话,可以用int
或者var
承载
testRect.qml
...
Rectangle {
...
enum RectType {
Rect1,
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,
Rect2,
Rect3,
};
Q_ENUM(RectType)
...
...
console.log(TestRect.Rect2)
调用方法:
- [自定义组件名(首字母大写)]
.
[枚举项] - [自定义组件名(首字母大写)]
.
[枚举名].
[枚举项]
另外,如果不是用enum,而是用enum class,那么调用方法就强制只能中间有枚举名
调用方法:[自定义组件名(首字母大写)].
[枚举名].
[枚举项]
console.log(TestRect.RectType.Rect3)