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

 

 

 

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页