Qt文档阅读笔记-Q_ENUM官方解析及实例

Q_ENUM宏将枚举类型定义到元对象系统中,这个宏要在枚举定义后面,并且这个类中要带有Q_OBJECT和Q_GADGET,在命名空间中使用Q_ENUM_NS()来替代。

class MyClass : public QObject
  {
      Q_OBJECT

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

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

枚举类型通过Q_ENUM将QMetaEnum注册到QMetaObject中。可以使用QMetaEnum::fromType()获取QMetaEnum。使用这个宏会自动注册到元对象系统中,可以使用QVariant存储以及使用QDebug打印其name。

注意:枚举类型存储在元对象系统时是int型。枚举类型太大超出范围时会溢出。

 

 

下面是博主例子:

这个例子说明了Q_ENUM的使用,以及用QVariant调用注册了的枚举,和如果QVariant调用没有注册的枚举会发生什么事情,以及QDebug的打印。

程序运行截图如下:

当QVariant.value()传入普通的枚举类型时:

会提示这个枚举没有在元对象系统中。

项目结构如下:

源码如下:

EnumTest.h

#ifndef ENUMTEST_H
#define ENUMTEST_H

#include <QObject>

class EnumTest : public QObject
{
    Q_OBJECT
public:
    EnumTest(QObject *parent = nullptr);
    enum MyType{
        One, Two, Three, Four
    };
    enum CType{
        One1, Two2, Three3, Four4
    };

    Q_ENUM(MyType)

};

#endif // ENUMTEST_H

EnumTest.cpp

#include "EnumTest.h"

EnumTest::EnumTest(QObject *parent) : QObject(parent)
{

}

main.cpp

#include <QCoreApplication>
#include <QMetaEnum>
#include <QDebug>
#include "EnumTest.h"

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

    QMetaEnum myType = QMetaEnum::fromType<EnumTest::MyType>();
    int count = myType.keyCount();

    for(int i = 0; i < count; i++){

        qDebug() << myType.value(i);
    }

    qDebug() << "----------华丽的分割线----------";

    qDebug() << EnumTest::MyType::One;
    qDebug() << EnumTest::One1;

    qDebug() << "----------华丽的分割线----------";
    QVariant var;
    qDebug() << var.value<EnumTest::MyType>();
    qDebug() << var.value<EnumTest::CType>();

    if(EnumTest::MyType::One == 0){

        qDebug() << "zero";
    }

    return a.exec();
}

源码打包下载地址:

https://github.com/fengfanchen/Qt/tree/master/Q_ENUMDemo

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值