1. 介绍
QMetaEnum类属于Qt core模块,提供了一系列针对枚举类型的操做函数,固然不能操做任意枚举类型,若想进行自定义枚举的操做,首先须要对枚举作处理,此时须要QObject类的帮助,使用此类提供的Q_ENUM模板。html
详细信息请见官方文档:QObject、QMetaEnumc++
2. 自定义枚举类型
- #include <QObject>
- class TestClass : public QObject {
- Q_OBJECT //必须有
- public:
- enum TestEnum {
- one = 0,
- two,
- three
- };
- Q_ENUM(TestEnum)
- };
枚举类型的声明与c++标准相同,只不过须要将枚举放置在一个继承自QObject的子类中,同时要使用Q_OBJECT模板,在枚举声明后面添加Q_ENUM(enum_name)便可。app
Qt自身的枚举类型都不须要此操做,能够直接使用。函数
- 必须有Q_OBJECT? 不能只继承自QObject
- Q_ENUM和Q_OBJECT都不要加分号,强迫症会出错
- 很遗憾不能将枚举类型直接放置在全局域
疑惑:这个类必须在单独的文件?直接放到main.cpp中一直报错,具体缘由没有详细研究post
3. QMetaEnum使用
Qt自身的枚举均可以直接使用。spa
- #include <QCoreApplication>
- #include <QDebug>
- #include <QMetaEnum>
- #include <QObject>
- #include "testclass.h"
- int main(int argc, char *argv[]) {
- QCoreApplication a(argc, argv);
- QMetaEnum tenum = QMetaEnum::fromType<TestClass::TestEnum>();
- qDebug() << tenum.isValid();//判断是否有效
- qDebug() << tenum.name();//枚举名字
- qDebug() << tenum.scope();//范围
- //获取枚举数量,根据序号获取字符串
- for(int i = 0; i < tenum.keyCount(); i++)
- qDebug() << tenum.key(i);
- //根据字符串获取值
- qDebug() << tenum.keyToValue("two");
- //根据值获取字符串
- qDebug() << tenum.valueToKey(2);
- //根据序号获取值
- for(int i = 0; i < tenum.keyCount(); i++)
- qDebug() << tenum.value(i);
-
- return 0;
- }
testclass.h就是上面的TestClass 类文件htm
QMetaEnum不光实现了枚举值和字符串的映射关系,额应该是key和value的映射关系,key 就是数字12345……,value就是枚举定义里面的字符串。同时还提供了枚举名称、枚举类型所属类、枚举项数量的函数,使用很方便。继承