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
版权声明:本文为博主原创文章,转载请附上博文链接!

QMetaEnum获取枚举元信息的更多相关文章

  1. .NET获取枚举DescriptionAttribute描述信息性能改进的多种方法

    一. DescriptionAttribute的普通使用方式 1.1 使用示例 DescriptionAttribute特性可以用到很多地方,比较常见的就是枚举,通过获取枚举上定义的描述信息在UI上显 ...

  2. C# 读取枚举描述信息实例

    using System;using System.Collections;using System.Collections.Generic;using System.Linq;using Syste ...

  3. C#枚举扩展方法,获取枚举值的描述值以及获取一个枚举类下面所有的元素

    /// <summary> /// 枚举扩展方法 /// </summary> public static class EnumExtension { private stat ...

  4. Golang仿云盘项目-2.2 保留文件元信息

    本文来自博客园,作者:Jayvee,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/16459817.html 目录结构 E:\goproj\FileStorage ...

  5. QMetaMethod 获取成员函数的元信息

    在上一篇中,我们将的是QMetaEnum类,它可以获得一个类中由Q_ENUM宏或Q_FLAG宏声明的枚举类型的元信息.同样,QMetaMethod类是用来获取成员方法的元信息的一个类.通过该类,我们可 ...

  6. C# .NET 获取枚举值的自定义属性(特性/注释/备注)信息

    一.引言 枚举为我看日常开发的可读性提供的非常好的支持,但是有时我们需要得到枚举值得描述信息或者是注释(备注)信息 比如要获得 TestEmun.aaa 属性值得备注 AAA,比较不方便得到. pub ...

  7. 实现php获取mp3文件元信息如播放时间歌曲作者等

    最近收集到一个php获取mp3文件元信息的类,感觉比较方便.现在分享给大家! 下面是使用方式和测试方式: <?php include_once 'mp3file.class.php'; func ...

  8. 第三章 EnumUtil根据值获取枚举对象

    项目中使用枚举类的好处这里不再赘述,在使用枚举值时,通常需要根据值来获取枚举对象,下面介绍两种实现方案: 1.在枚举类中定义方法实现 首先给出如下性别枚举类: public enum SexEnum ...

  9. C#获取枚举描述代码

    public class MusterEnum { /// 获取枚举的描述信息 /// </summary> /// <param name="e">传入枚 ...

随机推荐

  1. Go by Example-Switch分支结构

    上一节提到了Go语言中的if/else结构,但是条件过多的时候就不适合用if语句了,这个时候我们就可以使用switch语句了. 基本特性 switch 是一个条件语句,用于将一个表达式的求值结果与可能 ...

  2. Flutter移动电商实战 --(47)详细页_Flutter_html插件的使用

    详情里面是hemlt和图片组成的,但是flutter是不支持html的所以需要其他插件 flutter webview plugin:这个不太好用 flutter_html:用这个插件 先解决之前一个 ...

  3. 【SpringBoot/MVC】从Oracle下载百万条记录的CSV

    工程下载地址:https://files.cnblogs.com/files/xiandedanteng/CsvDownloadOracle20191110-2.rar 画面: 核心代码: 控制器: ...

  4. CV3——学习笔记-实战项目(上):如何搭建和训练一个深度学习网络

    http://www.mooc.ai/course/353/learn?lessonid=2289&groupId=0#lesson/2289 1.AlexNet, VGGNet, Googl ...

  5. python动态赋值-把字符串转为变量名

    可以实现的方法有: globals(),locals(),eval(),exec() 演示: exce法 In [6]: exec('name="bob"') In [7]: na ...

  6. spring boot配置文件、日志配置和代码的多环境配置

    一般项目都逃不掉开发.测试和生产这三套环境,如果每次给这三套环境打包都去改配置,累死不说,还一不留心就出差错.倒不如每套环境各给一套配置来的轻松.上代码: 1.通用配置放在application.pr ...

  7. Linux 下kafka集群搭建

    主机的IP地址: 主机IP地址 zookeeper kafka10.19.85.149 myid=1 broker.id=110.19.15.103 myid=2 broker.id=210.19.1 ...

  8. Maven 打war包

    使用maven将项目达成war包 右击项目的跟项目,选择run as 选择maven  build.... 进入窗口,在 Goals  输入命令   clean package,选择 skip Tes ...

  9. ContextCleaner ——Spark 应用程序的垃圾回收器

    ContextCleaner是一个Spark服务,负责在应用程序范围内清除 shuffles, RDDs, broadcasts, accumulators和checkpointed RDDs,目的是 ...

  10. windows 10 enterprize LTSC

    to avtivate the windows 10 enterprize LTSC version, do the following command every 6 months. slmgr - ...