QFlags详解

一、描述

QFlags<Enum>类是一个模板类,其中Enum是枚举类型。QFlags在Qt中用于存储枚举值的组合。

用于存储或组合枚举值的传统C++方法是使用整型变量。这种方法的不便之处在于根本没有类型检查,任何枚举值都可以与任何其他枚举值进行逻辑运算。

    enum Orientation
    {
        Up = 1,
        Down = 2,
        Left = 4,
        Right = 8,
    };

    enum Direction
    {
        horizontal = 2,
        vertical = 3,
    };

这两种操作编译器不会报错:

    Orientation::Up | Direction::horizontal;
    Orientation::Up | Orientation::Down;

第一种两个不相关的枚举值做逻辑运算没有意义,第二种运算结果是3,但Orientation中没有值是3的标识符。

Qt使用QFlags来提供类型安全性。

如果要对自己的枚举类型使用QFlags,应使用Q_DECLARE_FLAGS()和Q_DECLARE_OPERATORS_FOR_FLAGS()。

例:

  class MyClass
  {
  public:
    enum Orientation
    {
        Up = 1,
        Down = 2,
        Left = 4,
        Right = 8,
    };
    Q_DECLARE_FLAGS(Orientations, Orientation)
      ...
  };

  Q_DECLARE_OPERATORS_FOR_FLAGS(MyClass::Orientations)

 这样为枚举Orientation创建了一个Flags:Orientations,这个Orientations的类型就是QFlags<MyClass::Orientation>。可以用Orientations对象接收逻辑运算的值了:

    Orientations f = Orientation::Up | Orientation::Down;

二、Flags和元对象系统

要在元对象系统和Qt Designer中使用枚举必须加上:Q_FLAG(Orientations)

三、命名约定

一般在枚举类型后面加上s或Flag

四、使用QFlags进行逻辑运算

    enum class Orientation
    {
        Up = 1,
        Down = 2,
        Left = 4,
        Right = 8,
    };
    Q_ENUM(Orientation)		//如不使用Orientation,可省略
    Q_DECLARE_FLAGS(Orientations, Orientation)
    Q_FLAG(Orientations)


Q_DECLARE_OPERATORS_FOR_FLAGS(Widget::Orientations)
    QMetaEnum m = QMetaEnum::fromType<Widget::Orientations>();
    qDebug()<< "key To Value:"<<m.keyToValue("Up|Down");
    qDebug()<< "value To Key:"<<m.valueToKey(Orientation::Up|Orientation::Down);
    qDebug()<< "keys To Value:"<<m.keysToValue("Up|Down");
    qDebug()<< "value To Keys:"<<m.valueToKeys(Orientation::Up|Orientation::Down)<<endl;

    qDebug()<< "isFlag:"<<m.isFlag();
    qDebug()<< "name:"<<m.name();
    qDebug()<< "enumName:"<<m.enumName();
    qDebug()<< "scope:"<<m.scope()<<endl;

如图,up和down再次进行或运算结果是-1,也没有对应的枚举标识。

可以据此检测逻辑运算的结果有效性:

五、枚举定义在名称空间中的情况 

有几点不同:

1、需要加上Q_NAMESPACE宏,这个宏能够让命名空间具备简化的元对象能力,但不支持信号槽。

2、注册枚举的宏改成Q_ENUM_NSQ_FLAG_NS

3、Q_DECLARE_OPERATORS_FOR_FLAGS在名称空间中定义。

4、使用的时候前面的类名改成名称空间的名字。

namespace test
{
    Q_NAMESPACE
    enum class Orientation
    {
        Up = 1,
        Down = 2,
        Left = 4,
        Right = 8,
    };
    Q_ENUM_NS(Orientation)
    Q_DECLARE_FLAGS(Orientations, Orientation)
    Q_FLAG_NS(Orientations)
    Q_DECLARE_OPERATORS_FOR_FLAGS(Orientations)
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值