QMetaEnum获取枚举元信息
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获取枚举元信息的更多相关文章
- .NET获取枚举DescriptionAttribute描述信息性能改进的多种方法
一. DescriptionAttribute的普通使用方式 1.1 使用示例 DescriptionAttribute特性可以用到很多地方,比较常见的就是枚举,通过获取枚举上定义的描述信息在UI上显 ...
- C# 读取枚举描述信息实例
using System;using System.Collections;using System.Collections.Generic;using System.Linq;using Syste ...
- C#枚举扩展方法,获取枚举值的描述值以及获取一个枚举类下面所有的元素
/// <summary> /// 枚举扩展方法 /// </summary> public static class EnumExtension { private stat ...
- Golang仿云盘项目-2.2 保留文件元信息
本文来自博客园,作者:Jayvee,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/16459817.html 目录结构 E:\goproj\FileStorage ...
- QMetaMethod 获取成员函数的元信息
在上一篇中,我们将的是QMetaEnum类,它可以获得一个类中由Q_ENUM宏或Q_FLAG宏声明的枚举类型的元信息.同样,QMetaMethod类是用来获取成员方法的元信息的一个类.通过该类,我们可 ...
- C# .NET 获取枚举值的自定义属性(特性/注释/备注)信息
一.引言 枚举为我看日常开发的可读性提供的非常好的支持,但是有时我们需要得到枚举值得描述信息或者是注释(备注)信息 比如要获得 TestEmun.aaa 属性值得备注 AAA,比较不方便得到. pub ...
- 实现php获取mp3文件元信息如播放时间歌曲作者等
最近收集到一个php获取mp3文件元信息的类,感觉比较方便.现在分享给大家! 下面是使用方式和测试方式: <?php include_once 'mp3file.class.php'; func ...
- 第三章 EnumUtil根据值获取枚举对象
项目中使用枚举类的好处这里不再赘述,在使用枚举值时,通常需要根据值来获取枚举对象,下面介绍两种实现方案: 1.在枚举类中定义方法实现 首先给出如下性别枚举类: public enum SexEnum ...
- C#获取枚举描述代码
public class MusterEnum { /// 获取枚举的描述信息 /// </summary> /// <param name="e">传入枚 ...
随机推荐
- 个人学习分布式专题(二)分布式服务治理之Dubbo框架
目录 Dubbo框架 1.1 Dubbo是什么 1.2 Dubbo企业级应用示例(略) 1.3 Dubbo实现原理及架构剖析 1.4 Dubbo+Spring集成 Dubbo框架 1.1 Dubbo是 ...
- IO流——常用IO流详解
1:字节流 字节流:用于处理以字节为单位的二进制文件(如音乐,图片等) InputStream 是抽象类 它的对应子类FileInputStream可以被实例化 构造方法: FileInputStre ...
- 微信小程序wx.request的简单封装
前言 之前写小程序,每次请求后台时都直接调用原生的API,wx.request,每次都要写url,data,回调函数等,正好前段时间,小程序项目需要添加新内容,趁此机会,做一个封装的请求工具,比较简单 ...
- 唯品会HDFS性能挑战和优化实践
唯品会HDFS性能挑战和优化实践 原创: 大数据平台 唯技术 4月1日 https://mp.weixin.qq.com/s/LMa99ubgACI4eaDV3G-6gw
- ElasticSearch 6 安装、下载
1,安装配置JDK 8 参考:官方文档 #为什么是JDK1.8?在ElasticSearch6.2.4中提到:JDK版本必须为:1.8.0_131 以上 > 1,安装JDK1.8-161 #解压 ...
- django模型多对多调用
对于如下的模型: from django.db import models # Create your models here. class Student(models.Model): name = ...
- 第三方框架----FMDB的使用
以下是SQLite API进行封装的库FMDB的简单使用 : FMDB框架的下载地址 :https://github.com/ccgus/fmdb 代码如下 : //// ViewControlle ...
- 定期删除IIS日志文件
服务器中由于监控的需要会经常生成很多日志文件,比如IIS日志文件(C:\inetpub\logs\LogFiles),一个稍微有流量的网站,其日志每天可以达到上百兆,这些文件日积月累会严重的占用服务器 ...
- 安卓 adb命令
获取包名 aapt d badging C:\Users\600844\Desktop\beijingtoon.apk "package launchable-activity" ...
- 2019-11-8 Linux作业 李宗盛
linux系统的特点:完全免费,高效,安全稳定.支持多种硬件平台.有好的用户界面.强大的网络功能.支持多任务多用户. linux一般有三个主要部分:内核.命令解释层.实用工具. 那合适系统的心脏,是运 ...