QFlags类
template <typename Enum> class QFlagsQFlags类提供了一种自动安全的存储枚举值或组合的方式。 更多...
头文件 | #include <QFlags> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake | QT += core |
公共类型
公共函数
QFlags() | |
QFlags(Enum flags) | |
QFlags(QFlag flag) | |
QFlags(std::initializer_list<Enum> flags) | |
QFlags(const QFlags<T> &other) | |
QFlags<T> & | setFlag(Enum flag, bool on = true) |
(since 6.2) bool | testAnyFlag(Enum flag) const |
(since 6.2) bool | testAnyFlags(QFlags<T> flags) const |
bool | testFlag(Enum flag) const |
(since 6.2) bool | testFlags(QFlags<T> flags) const |
(since 6.2) QFlags<T>::Int | toInt() const |
QFlags<T>::Int | operator QFlags<T>::Int() const |
bool | operator!() const |
QFlags<T> | operator&(int mask) const |
QFlags<T> | operator&(uint mask) const |
(since 6.2) QFlags<T> | operator&(QFlags<T> other) const |
QFlags<T> | operator&(Enum other) const |
QFlags<T> & | operator&=(int mask) |
QFlags<T> & | operator&=(uint mask) |
(since 6.2) QFlags<T> & | operator&=(QFlags<T> mask) |
QFlags<T> & | operator&=(Enum mask) |
int & | operator=(const QFlags<T> &) |
QFlags<T> | operator^(QFlags<T> other) const |
QFlags<T> | operator^(Enum other) const |
QFlags<T> & | operator^=(QFlags<T> other) |
QFlags<T> & | operator^=(Enum other) |
QFlags<T> | operator|(QFlags<T> other) const |
QFlags<T> | operator|(Enum other) const |
QFlags<T> & | operator|=(QFlags<T> other) |
QFlags<T> & | operator|=(Enum other) |
QFlags<T> | operator~() const |
静态公有成员
(since 6.2) QFlags<T> | fromInt(QFlags<T>::Int i) |
相关非成员
(自6.2起) size_t | qHash(QFlags<Enum> flags, size_t seed = 0) |
宏定义
Q_DECLARE_FLAGS(Flags, Enum) | |
Q_DECLARE_OPERATORS_FOR_FLAGS(Flags) |
详细说明
QFlags<Enum>类是一个模板类,其中Enum是一个枚举类型。QFlags在Qt中被用于存储枚举值的组合。
存储枚举值的OR组合的传统C++方法是使用一个int
或uint
变量。这种方法的不便之处在于没有任何类型检查;任何枚举值都可以与任何其他枚举值进行OR操作,并传递给接受int
或uint
的函数。
Qt使用QFlags来提供类型安全性。例如,Qt::Alignment类型仅仅是QFlags<Qt::AlignmentFlag>的一个 typedef。 QLabel::setAlignment() 接受一个 Qt::Alignment 参数,这意味着任何Qt::AlignmentFlag值的组合,或 { }
,都是合法的
label->setAlignment(Qt::AlignLeft | Qt::AlignTop); label->setAlignment({ });
如果你尝试传递来自另一个枚举或除了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) ... }; Q_DECLARE_OPERATORS_FOR_FLAGS(MyClass::Options)
然后你可以使用MyClass::Options
类型来存储MyClass::Option
值的组合。
标志和元对象系统
Q_DECLARE_FLAGS()宏不会将标志暴露给元对象系统,因此它们不能由Qt脚本或Qt设计师编辑。为了使标志可用于这些目的,必须使用Q_FLAG()宏。
Q_FLAG(Options)
命名约定
对于枚举类型及其相关QFlags类型,一个合理的命名约定是为枚举类型提供一个单数名称(例如,Option
),并为QFlags类型提供一个复数名称(例如,Options
)。当QFlags类型需要单数名称时(例如,Alignment
),可以使用Flag
作为枚举类型的后缀(例如,AlignmentFlag
)。
另请参阅 QFlag.
成员类型文档
QFlags::Int
用于存储以及隐式转换的整型类型的typedef。可以是int
或unsigned int
,具体取决于枚举的底层类型是有符号还是无符号。
QFlags::enum_type
枚举模板类型的typedef。
成员函数文档
[constexpr noexcept]
QFlags::QFlags()
构造一个不带标志设置的QFlags对象。
[constexpr noexcept]
QFlags::QFlags(Enum flags)
构造一个存储 flags 的 QFlags 对象。
[constexpr noexcept]
QFlags::QFlags(QFlag flag)
使用整数 flag 初始化一个 QFlags 对象。
QFlag 类型是一个辅助类型。在这里使用 QFlag 而不是 int
,我们可以有效地确保任意枚举值不能被转换为 QFlags,而未类型化的枚举值(即 int
值)可以。
[constexpr noexcept]
QFlags::QFlags(std::initializer_list<Enum> flags)
使用按位或运算符合并所有 flags 以初始化 QFlags 对象。
另请参阅operator|=() 和 operator|。
[default]
QFlags::QFlags(const QFlags<T> &other)
构造一个 other 的副本。
[static constexpr noexcept, since 6.2]
QFlags<T> QFlags::fromInt(QFlags<T>::Int i)
构造一个表示整数值 i 的 QFlags 对象。
此函数自 Qt 6.2 版本开始引入。
[constexpr noexcept, since 6.2]
QFlags<T> &QFlags::setFlag(Enum flag, bool on = true)
如果 on 为 true
则设置标志 flag;如果 on 为 false
则取消设置。返回此对象的引用。
[constexpr noexcept, since 6.2]
bool QFlags::testAnyFlag(Enum flag) const
如果 flag 中设置了任何标志,则返回 true
;否则返回 false
。如果 flag 没有设置任何标志,总是返回 false
。
此函数自 Qt 6.2 版本开始引入。
另请参阅testFlag。
[constexpr noexcept, since 6.2]
bool QFlags::testAnyFlags(QFlags<T> flags) const
如果 flags 中设置了任何标志,则返回 true
;否则返回 false
。如果 flags 没有设置任何标志,总是返回 false
。
此函数自 Qt 6.2 版本开始引入。
另请参阅testFlags。
[constexpr noexcept]
bool QFlags::testFlag(Enum flag) const
如果标志 flag 已设置,则返回 true
,否则返回 false
。
注意: 如果 标志 包含多个设置为1的位(例如,它是一个等于其他枚举位或的枚举器),则该函数仅在所有位在此标志对象中都设置为1时返回 true
。另一方面,如果 标志 没有设置为1的位(即其作为整数的值为0),则该函数仅在也在此标志对象中没有位设置为1时返回 true
。
另请参阅 testAnyFlag().
[constexpr noexcept, since 6.2]
bool QFlags::testFlags(QFlags<T> 标志) const
如果此标志对象与给定的 标志 匹配,则返回 true
。
如果 标志 设置了任何标志,则当 标志 中设置的标志也在此标志对象中设置时,该标志对象将精确匹配。否则,当 标志 没有设置任何标志时,只有当它也没有设置任何标志时,该标志对象才匹配。
此函数自 Qt 6.2 版本开始引入。
另请参阅 testAnyFlags().
[constexpr noexcept, since 6.2]
QFlags<T>::Int QFlags::toInt() const
返回存储在 QFlags 对象中的整数值。注意,返回的整数可能是有符号的或无符号的,具体取决于枚举的底层类型是有符号的还是无符号的。
此函数自 Qt 6.2 版本开始引入。
另请参阅 Int.
[constexpr noexcept]
QFlags<T>::Int QFlags::operator QFlags<T>::Int() const
返回存储在 QFlags 对象中的整数值。
另请参阅 Int.
[constexpr noexcept]
bool QFlags::operator!() const
如果没有设置标志(即 QFlags 对象存储的值为0),则返回 true
;否则返回 false
。
[constexpr noexcept]
QFlags<T> QFlags::operator&(int 掩码) const
返回一个包含对此对象和 掩码 进行位与操作结果的 QFlags 对象。
另请参阅 operator&=,operator|,operator^ 和 operator~。
[constexpr noexcept]
QFlags<T> QFlags::operator&(uint 掩码) const
这是一个重载函数。
[constexpr noexcept, since 6.2]
QFlags<T> QFlags::operator&(QFlags<T> 其他) const
这是一个重载函数。
此函数自 Qt 6.2 版本开始引入。
constexpr [noexcept] [constexpr noexcept]
QFlags<T> QFlags::operator&(Enum other) const
这是一个重载函数。
constexpr [noexcept] [constexpr noexcept]
QFlags<T> &QFlags::operator&=(int mask)
使用 mask 和此 QFlags 对象进行位与操作并将结果存储在此对象中。返回对此对象的引用。
另请参阅operator& (), operator| () 和 operator^= ()。
constexpr [noexcept] [constexpr noexcept]
QFlags<T> &QFlags::operator&=(uint mask)
这是一个重载函数。
constexpr [noexcept, since 6.2] [constexpr noexcept, since 6.2]
QFlags<T> &QFlags::operator&=(QFlags<T> mask)
这是一个重载函数。
此函数自 Qt 6.2 版本开始引入。
constexpr [noexcept] [constexpr noexcept]
QFlags<T> &QFlags::operator&=(Enum mask)
这是一个重载函数。
[default]
int &QFlags::operator=(const QFlags<T> &)
将 other 分配给此对象并返回对此对象的引用。
constexpr [noexcept] [constexpr noexcept]
QFlags<T> QFlags::operator^(QFlags<T> other) const
返回一个包含在此对象和 other 上进行位异或操作的结果的 QFlags 对象。
另请参阅operator^= (), operator& (), operator| () 和 operator~ ()。
constexpr [noexcept] [constexpr noexcept]
QFlags<T> QFlags::operator^(Enum other) const
这是一个重载函数。
constexpr [noexcept] [constexpr noexcept]
QFlags<T> QFlags::operator^(QFlags<T> other)
将 other 与此 QFlags 对象进行位异或操作并将结果存储在此对象中。返回对此对象的引用。
另请参阅operator^ (), operator&= () 和 operator|= ()。
constexpr [noexcept] [constexpr noexcept]
QFlags<T> &QFlags::operator^=(Enum other)
这是一个重载函数。
[constexpr nonstd::throw_nothrow]
QFlags<T> QFlags::operator|(QFlags<T> other) const
返回一个包含对此对象和 other 执行位或运算结果的 QFlags 对象。
另请参阅operator|=(),operator^(),operator&() 和 operator~()。
[constexpr nonstd::throw_nothrow]
QFlags<T> QFlags::operator|(Enum other) const
这是一个重载函数。
[constexpr nonstd::throw_nothrow]
QFlags<T> &QFlags::operator|=(QFlags<T> other)
将 other 与此执行位或运算,并将结果存储在此 QFlags 对象中。返回对此对象的引用。
另请参阅operator|(),operator&=() 和 operator^=()。
[constexpr nonstd::throw_nothrow]
QFlags<T> &QFlags::operator|=(Enum other)
这是一个重载函数。
[constexpr nonstd::throw_nothrow]
QFlags<T> QFlags::operator~() const
返回包含此对象的位取反结果的 QFlags 对象。
相关非成员函数
[constexpr nonstd::throw_nothrow,自6.2版本起]
template <typename Enum> size_t qHash(QFlags<Enum> flags, size_t seed = 0)
使用 seed 来初始化计算,计算标志的哈希值。
此函数自 Qt 6.2 版本开始引入。
宏文档
Q_DECLARE_FLAGS(Flags, Enum)
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() 宏声明了类型为 QFlags<T> 的 Flags 的全局 operator|()
函数。
有关详细信息,请参阅 QFlags 文档。
另请参阅Q_DECLARE_FLAGS()。
© 2024 Qt 公司 Ltd。本文档中包含的贡献是各自所有者的版权。提供的文档根据自由软件基金会发布的GNU自由文档许可证版本1.3 的条款进行许可。Qt及其标志是在芬兰和/或世界其他地区的The Qt Company Ltd.的商标。所有其他商标均为各自所有者的财产。