Qt QML的枚举浅用

发布于:2024-04-05 ⋅ 阅读:(31) ⋅ 点赞:(0)

序言

概念

QML的枚举和C++的其实差不多,但是呢,局限比较多,首先不能在main.qml里定义,也不能在子项中定义

解释:

  1. main.qml的根节点定义枚举,没法用main.或者Main.
  2. 子项中定义,比如说Rectangle里的Text,你没法寻到此处的枚举,直接Text.也不合适,Text本身没有定义你自定义的枚举,你是调用不了的

只允许两种定义方法,一种是自定义控件里的根节点定义,另一种是通过C++的Q_ENUM定义。

注:以上非绝对,只是自己的经验总结,可能只是暂时没遇到正确方法

命名规则

枚举要想在QML里用,命名需要满足两个条件:

1.枚举名首字母必须是大写,不大写的话也会编译不过:

enum rectType {		//编译不过
...
enum RectType {		//编译通过

在这里插入图片描述

  1. 枚举项首字母也必须是大写:
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)

调用方法:

  1. [自定义组件名(首字母大写)].[枚举项]
  2. [自定义组件名(首字母大写)].[枚举名].[枚举项]

另外,如果不是用enum,而是用enum class,那么调用方法就强制只能中间有枚举名
调用方法:[自定义组件名(首字母大写)].[枚举名].[枚举项]

	console.log(TestRect.RectType.Rect3)