QFlag、QFlags类

QFlag

详细描述

QFlag 类是 QFlags 的辅助数据类型。

它相当于一个普通的int,但在函数重载和类型转换方面有所不同。在应用程序中永远不应需要使用此类。

成员函数

QFlag::QFlag(int value)

构建一个存储给定值的QFlag对象。

QFlag::QFlag(uint value)

构建一个QFlag对象,该对象存储给定的值。

此函数在 Qt 5.3 中引入。

QFlag::QFlag(short value)

构建一个存储给定值的QFlag对象。

此函数在 Qt 5.3 中引入。

QFlag::QFlag(ushort value)

构建一个QFlag对象,该对象存储给定的值。

此函数在 Qt 5.3 中引入。

QFlag::operator int() 

返回由QFlag对象存储的值。

QFlag::operator uint() 

返回由QFlag对象存储的值。

此函数在 Qt 5.3 中引入。

QFlags

详细描述

QFlags 类提供了一种类型安全的方式来存储枚举值的或组合。

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

传统的 C++ 用于存储枚举值的“或”组合的方法是使用intuint变量。这种方法的不便之处在于根本没有类型检查;任何枚举值都可以与任何其他枚举值进行“或”运算,并传递给接受intuint的函数。

Qt 使用QFlags来提供类型安全性。例如,Qt::Alignment类型仅仅是QFlags<Qt::AlignmentFlag>的类型定义。QLabel::setAlignment()接受一个Qt::Alignment参数,这意味着Qt::AlignmentFlag值的任何组合或 0 都是合法的:

label->setAlignment(Qt::AlignLeft | Qt::AlignTop);

如果试图传递来自另一个枚举的值或者一个非 0 的普通整数,编译器将会报告错误。如果需要以无类型的方式将整数值转换为标志,可以使用显式的 QFlags 构造函数作为转换运算符。

如果想要将 QFlags 用于自身的枚举类型,那么请使用 Q_DECLARE_FLAGS() 以及 Q_DECLARE_OPERATORS_FOR_FLAGS() 。

 示例:

class MyClass
{
public:
    enum Option {
        NoOptions = 0x0,
        ShowTabs = 0x1,
        ShowAll = 0x2,
        SqueezeBlank = 0x4
    };
    Q_DECLARE_FLAGS(Options, Option)
    ...
};

然后,就可以使用MyClass::Options类型来存储MyClass::Option值的组合。 

  • Flags 与元对象系统

Q_DECLARE_FLAGS() 宏不会将标志向元对象系统公开,所以它们无法被 Qt 脚本使用或者在 Qt 设计器中进行编辑。为了让这些标志能用于上述目的,必须使用 Q_FLAG() 宏。

Q_FLAG(Options)
  • 命名约定

对于枚举类型和相关的 QFlags 类型,一种合理的命名约定是:给枚举类型一个单数名称(例如,Option),给 QFlags 类型一个复数名称(例如,Options)。当希望 QFlags 类型为单数名称时(例如,Alignment),可以将 Flag 用作枚举类型的后缀(例如,AlignmentFlag)。 

参考QFlag

成员类型

typedef QFlags::Int

这是关于整数类型的定义说明,用于存储以及隐式转换。其类型可能是 int 或者 unsigned int,具体取决于枚举的底层类型是有符号还是无符号。

此定义类型是在 Qt 5.0 中引入的。

typedef QFlags::enum_type

枚举(Enum)模板类型的类型定义

成员函数

QFlags::QFlags(const QFlags &other)

构建一个其他对象的副本

QFlags::QFlags(Enum flag)

构建一个存储给定标志的QFlags对象。

QFlags::QFlags(Zero zero = Q_NULLPTR)

构建一个没有设置任何标志的QFlags对象。 zero必须是字面值 0 值。

QFlags::QFlags(QFlag value)

构建一个QFlags对象,使用给定的整数值进行初始化。

QFlag 类型是一种辅助类型。在此处使用它而非 int 类型,能够有效地确保任意的枚举值无法转换为 QFlags ,然而未类型化的枚举值(即 int 值)则可以。

QFlags::QFlags(std::initializer_list<Enum> flags)

构建一个QFlags对象,使用按位或运算符将所有标志组合进行初始化。

此函数在 Qt 5.4 中引入。

另请参阅operator|=() 与operator|().

bool QFlags::testFlag(Enum flag) const

如果标志已设置,则返回true,否则返回false。

此函数在 Qt 4.2 中引入。

QFlags::operator Int() const

返回存储在QFlags对象中的值作为整数。

另请参阅 Int

bool QFlags::operator!() const

如果没有设置任何标志(即 QFlags 对象存储的值为 0),则返回真;否则返回假。

QFlags QFlags::operator&(int mask) const

返回一个 QFlags 对象,该对象包含了对当前对象和mask执行按位与运算的结果。

另请参阅 operator&=(), operator|(), operator^(), 与 operator~().

QFlags QFlags::operator&(uint mask) const

这是一个重载函数

QFlags QFlags::operator&(Enum mask) const

这是一个重载函数

QFlags &QFlags::operator&=(int mask)

mask执行按位与运算,并将结果存储在这个 QFlags 对象中。返回对此对象的引用。

另请参阅 operator&(), operator|=(), 与 operator^=().

QFlags &QFlags::operator&=(uint mask)

这是一个重载函数

QFlags &QFlags::operator&=(Enum mask)

这是一个重载函数

QFlags &QFlags::operator=(const QFlags &other)

other分配给此对象,并返回对此对象的引用。

QFlags QFlags::operator^(QFlags other) const

返回一个QFlags对象,其中包含此对象与其他进行按位异或运算的结果。

另请参阅 operator^=(), operator&(), operator|(), 与operator~().

QFlags QFlags::operator^(Enum other) const

这是一个重载函数

QFlags &QFlags::operator^=(QFlags other)

这是一个重载函数

QFlags QFlags::operator|(Enum other) const

这是一个重载函数

QFlags &QFlags::operator|=(QFlags other)

other执行按位或运算,并将结果存储在这个 QFlags 对象中。返回对此对象的引用。

另请参阅  operator|(), operator&=(), 与operator^=().

QFlags &QFlags::operator|=(Enum other)

这是一个重载函数

QFlags QFlags::operator~() const

这是一个重载函数

Q_DECLARE_FLAGS(FlagsEnum)

Q_DECLARE_FLAGS() 宏扩展为

typedef QFlags<Enum> Flags;

Enum是现有枚举类型的名称,而标志Flags是QFlags<Enum>类型定义的名称。

查看QFlags文档以获取详细信息。

另请参阅 Q_DECLARE_OPERATORS_FOR_FLAGS() 。

Q_DECLARE_OPERATORS_FOR_FLAGS(Flags)

Q_DECLARE_OPERATORS_FOR_FLAGS() 宏为 Flags 声明全局operator|()函数,其类型为QFlags

查看QFlags文档以获取详细信息。

另请参阅 Q_DECLARE_FLAGS() 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春意盎然的三月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值