开发笔记之Q_ENUM\Q_ENUM_NS\Q_FLAG\Q_FLAG_NS

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()

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值