Q_ENUM是一個宏定義,它的作用是將一個枚舉類型注冊到元對象系統,從而能夠通過QMetaEnum類獲得一些關于enum類型的一些信息,例如獲取enum類型的名稱字符串,enum值和字符串互相轉換,enum類型保存在QVariant中,enum值的個數,qDebug()打印enum值名稱等等。
用法:在一個繼承于QObject的子類中聲明enum,然后在定義后面使用Q_ENUM宏注冊enum類型。如下:
class MyClass : public QObject
{Q_OBJECTpublic:MyClass(QObject *parent = nullptr);~MyClass();enum Priority { High, Low, VeryHigh, VeryLow };Q_ENUM(Priority)void setPriority(Priority priority);Priority priority() const;
};
隨后通過QMetaEnum獲取enum類型的相關信息。
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。