Qt QML的枚举浅用

序言

概念

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 = 1,
	Rect2,
	Rect3,		//编译出错,不能加,
}

另外,第一个枚举一定要设 = 1,这是因为QML中某些用到了第一个枚举的,会被判断为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)

调用方法:

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

另外,如果不是用enum,而是用enum class,那么调用方法就强制只能中间有枚举名,但是有些版本又可以不用中间的枚举名,直接访问,具体效果自行试验自己用的版本。
调用方法:[自定义组件名(首字母大写)].[枚举名].[枚举项]

	console.log(TestRect.RectType.Rect3)
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

溪渣渣_梁世华

打赏?我甚至没有任何收费的章节

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值