Q_ENUM(...)
- 这个宏注册一个枚举类型到元对象系统。它必须放到拥有宏Q_OBJECT或宏Q_GADGET的类中的enum声明之后。在命名空间中使用Q_ENUM_NS()取代。
例子:
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;
};
- 使用场景
- 使用Q_ENUM申明的enum会注册到元对象系统,故信号槽使用该enum时无须申明Q_DECLARE_METATYPE()
- QVariant也默认支持该类型
- 可将enum类型输出为字符串,方便打印输出调试
qDebug() << MyClass::Priority::Low;
qDebug() << QVariant::fromValue<MyClass::Priority>(MyClass::Priority::Low).toString();
Q_ENUM_NS(...)
这个宏注册一个enum类型到元对象系统。它必须放到拥有宏Q_NAMESPACE的命名空间enum之后。它和Q_ENUM一样不过是在命名空间中。
例子
namespace MyNamespace
{
Q_NAMESPACE
enum Priority
{
High = 1,
Low = 2,
VeryHigh = 4,
VeryLow = 8,
};
Q_ENUM_NS(Priority)
Q_DECLARE_FLAGS(Prioritys, Priority)
}
Q_FLAG(...)
这个宏注册一个单独的 flags类型到元对象系统。它典型的用法是用在类中申明一个enum作为支持异或操作的flags,并且。在命名空间使用Q_FLAG_NS替代。
这个宏必须放到enum申明之后。该flags类型申明使用宏Q_DECLARE_FLAGS()
例如在QItemSelectionModel中,SelectionFlags标识以以下的方式申明:
class QItemSelectionModel : public QObject
{
Q_OBJECT
public:
...
enum SelectionFlag {
NoUpdate = 0x0000,
Clear = 0x0001,
Select = 0x0002,
Deselect = 0x0004,
Toggle = 0x0008,
Current = 0x0010,
Rows = 0x0020,
Columns = 0x0040,
SelectCurrent = Select | Current,
ToggleCurrent = Toggle | Current,
ClearAndSelect = Clear | Select
};
Q_DECLARE_FLAGS(SelectionFlags, SelectionFlag)
Q_FLAG(SelectionFlags)
...
}
注意:Q_FLAG宏负责将单个flag注册到元对象系统,因此无须再使用Q_ENUM宏。
- 使用场景
- 使用Q_FLAG申明的enum会注册到元对象系统,故信号槽使用该enum时无须申明Q_DECLARE_METATYPE()
- QVariant也默认支持该类型
- 使enum支持异或操作
Q_FLAG_NS(...)
这个宏注册一个单独的flags类型到元对象系统。。它典型的用法是用在拥有Q_NAMESPACE宏的命名空间中申明一个enum作为支持异或操作的flags。
这个宏必须放到enum申明之后。
注意:Q_FLAG_NS宏负责注册单个flag值到元对象系统,因此无须再使用Q_ENUM_NS()