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