QMetaEnum 类提供了一个枚举的元数据。我们可以使用该类的静态模板函数,fromType<enumerator>来获得关于某个枚举的QMetaEnum对象,然后就可以调用该类的成员函数来获得该枚举的相关信息。该枚举必须使用Q_ENUM宏进行声明。

我们可以使用name()函数来获得枚举的名字;使用key()函数获得枚举的键,即每个枚举项的名字;使用keyCount()函数得到键的个数。

isFlag()函数可以用来判断该枚举是否可以作为flag使用,即每一个枚举项是否可以使用OR操作符进行运算。

keyToValue(),valueToKey(),keysToValue()和valueToKeys()函数,可以用来在枚举项的整数表示和字符串表示之间进行转换。

scope()函数可以返回该枚举作用域的类名,即给枚举所在的类。

下面,我们通过一个例子,简单的使用一下该类的每一个成员函数。代码如下:

我们先声明一个QObject的子类,在该类中定义一个枚举类型:

#ifndef MYCLASS_H
#define MYCLASS_H

#include <QObject>

class MyClass : public QObject
{
Q_OBJECT
public:
explicit MyClass(QObject *parent = 0);
~MyClass(){}

enum Priority { High, Low, VeryHigh, VeryLow };
Q_ENUM(Priority)
};

#endif // MYCLASS_H

然后在main函数,使用QMetaEnum打印出该枚举的详细信息:
#include <QCoreApplication>
#include <QMetaEnum>
#include <QDebug>
#include "myclass.h"

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QMetaEnum me = QMetaEnum::fromType<MyClass::Priority>();
qDebug() << me.isFlag();
qDebug() << me.isValid();
for(int i = 0; i < me.keyCount(); i++)
qDebug() << me.key(i);
qDebug() << me.keyToValue("High");
qDebug() << me.name();
qDebug() << me.scope();
for(int i = 0; i < me.keyCount(); i++)
qDebug() << me.value(i);
qDebug() << me.valueToKey(2);

return a.exec();
}
运行结果如下:

由输出结果可以看到,由于我们没有将枚举声明为flag,所以isFlag()函数返回false。

如果我们在Q_ENUM(Property)下面添加下面在两句代码:

Q_DECLARE_FLAGS(Priorities, Priority)
Q_FLAG(Priorities)

再讲main函数中fromType()函数的调用修改如下:
QMetaEnum me = QMetaEnum::fromType<MyClass::Priorities>();

再运行程序,结果如下:

可以看到,此时isFlag()函数就返回了true,并且对其他函数的调用并不受影响。这是因为,Q_FLAG宏会向Qt元对象系统注册每一个枚举项。也就是说,使用了Q_FLAG,就不必再使用Q_ENUM宏了。所以,将Q_ENUM(property)注释掉,代码仍可以争取运行,大家可以自行测试即可。
---------------------
作者:求道玉
来源:CSDN
原文:https://blog.csdn.net/Amnes1a/article/details/69089469
版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. [转]ping检测网络连接异常
  2. MVC中关于Membership类跟数据库的问题
  3. 十天冲刺---Day7
  4. service里面弹出对话框
  5. 全面理解HTTP
  6. Flex+Struts2+JSON实现Flex和后台的HTTP Service请求
  7. MySQL优化技巧之五(mysql查询性能优化)
  8. bootstrap注意事项(七)图片
  9. vb.net 操作xml
  10. c++ ,protected 和 private修饰的构造函数
  11. 随机IP代理
  12. [Python]网络爬虫(三):异常的处理和HTTP状态码的分类
  13. .Net Core---- 通过EPPlus批量导出
  14. test-overflow:ellipsis的应用----转载
  15. 进程间通信IPC-信号
  16. linux alias 别名设置【转载】
  17. day10--协成\异步IO\缓存
  18. docker参数expose使用
  19. SpringMVC知识(1)
  20. jquery 动态添加的代码不能触发绑定事件

热门文章

  1. Markdown 小记
  2. RESTful入门
  3. OpenResty之ngx.var.VARIABLE
  4. Flutter移动电商实战 --(39)路由_Fluro的路由配置和静态化
  5. Oracle数据库-primary key/foreign key和references关系
  6. ISO/IEC 9899:2011 条款6.4.9——注释
  7. osg osgUtil::LineSegmentIntersector
  8. spring boot配置文件、日志配置和代码的多环境配置
  9. topcoder srm 633 div1
  10. .NET CORE添加引用包