Qt-Q_ENUM宏和QMetaEnum类

Q_ENUM是一个宏定义,它的作用是将一个枚举类型注册到元对象系统,从而能够通过QMetaEnum类获得一些关于enum类型的一些信息,例如获取enum类型的名称字符串,enum值和字符串互相转换,enum类型保存在QVariant中,enum值的个数,qDebug()打印enum值名称等等。

用法:在一个继承于QObject的子类中声明enum,然后在定义后面使用Q_ENUM宏注册enum类型。如下:

cpp 复制代码
class MyClass : public QObject
{
    Q_OBJECT

public:
    MyClass(QObject *parent = nullptr);
    ~MyClass();

    enum Priority { High, Low, VeryHigh, VeryLow };
    Q_ENUM(Priority)
    void setPriority(Priority priority);
    Priority priority() const;
};

随后通过QMetaEnum获取enum类型的相关信息。

cpp 复制代码
QMetaEnum metaEnum = QMetaEnum::fromType<MyClass ::Priority >();
qDebug() << metaEnum.enumName();  // Priority
qDebug() << metaEnum.keyCount();  // 4
QString s = metaEnum.valueToKey(MyClass::Priority::Low;  // Low
int p = metaEnum.keyToValue(s);  // 1
MyClass::Priority e = (MyClass::Priority)p;
qDebug() << e; // 打印MyClass::Low而不是1
QVariant v = QVariant::fromValue(e);  // 保存在QVariant中

使用Q_ENUM声明的枚举类型已经在元对象系统中注册,不再需要使用Q_DELCARE_METATYPE。

相关推荐
ℳ๓₯㎕.空城旧梦19 小时前
C++中的解释器模式
开发语言·c++·算法
JdayStudy19 小时前
SIR 网络传播仿真软件说明书
开发语言·网络·php
有点傻的小可爱19 小时前
【MATLAB】新安装并口如何实现能通过PTB启用?
开发语言·windows·经验分享·matlab
符哥200819 小时前
充电桩 WiFi 局域网配网(Android/Kotlin)流程、指令及实例说明文档
android·开发语言·kotlin
weixin_4563216419 小时前
Java架构设计:Redis持久化方案整合实战
java·开发语言·redis
2401_8795034119 小时前
C++与FPGA协同设计
开发语言·c++·算法
asom2220 小时前
DDD(领域驱动设计) 核心概念详解
java·开发语言·数据库·spring boot
oem11020 小时前
C++中的访问者模式变体
开发语言·c++·算法
mengzhi啊20 小时前
Qt Designer UI 界面 拖的两个 QLineEdit,想按 Tab 从第一个跳到第二个
qt
SuperEugene21 小时前
JS/TS 编码规范实战:Vue 场景变量 / 函数 / 类型标注避坑|编码语法规范篇
开发语言·javascript·vue.js