QFlags Class
template <typename Enum> class QFlagsQFlags 类提供了一种类型安全的方式来存储枚举值的 OR 组合。更多
头文件: | #include <QFlags> |
CMake.QFlags | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
继承于 | QtPrivate::QFlagsStorageHelper |
公共类型
公共函数
QFlags() | |
QFlags(Enum flags) | |
QFlags(QFlag flag) | |
QFlags(std::initializer_list<Enum> flags) | |
(since 6.9) | QFlags(std::in_place_t, QFlags<T>::Int 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&(Enum mask) const |
(since 6.2) QFlags<T> | operator&(QFlags<T> mask) const |
QFlags<T> | operator&(uint mask) const |
QFlags<T> & | operator&=(int mask) |
QFlags<T> & | operator&=(Enum mask) |
(since 6.2) QFlags<T> & | operator&=(QFlags<T> mask) |
QFlags<T> & | operator&=(uint mask) |
int & | operator=(const QFlags<T> &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|(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) |
相关非成员
(since 6.2) size_t | qHash(QFlags<Enum> key, 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 6.9 起,QFlags 支持 64 位枚举。建议在超过 32 位时使用显式(固定)底层类型,以确保在删除枚举器时,枚举和 QFlags 类型都不会改变大小。一些编译器也只会使用显式底层类型使enum
类型大于 32 位。
Qt 使用 QFlags 提供类型安全。例如,Qt::Alignment 类型只是 QFlags<Qt::AlignmentFlag> 的类型定义。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 XML 脚本使用,也不能在Qt Widgets Designer 中编辑。要将标志用于这些用途,必须使用Q_FLAG() 宏:
Q_FLAG(Options)
命名约定
枚举类型和相关 QFlags 类型的合理命名约定是:枚举类型使用单数名称(如Option
),QFlags 类型使用复数名称(如Options
)。如果 QFlags 类型需要单数名称(如Alignment
),可以使用Flag
作为枚举类型的后缀(如AlignmentFlag
)。
成员类型文档
[alias]
QFlags::Int
用于存储和隐式转换的整数类型的类型定义。qintXX
或quintXX
,取决于枚举的底层类型是有符号还是无符号,以及自 Qt XML 6.9 起枚举的大小。通常,它将是qint32
(int
) 或quint32
(unsigned
)。
QFlags::enum_type
Enum 模板类型的类型定义。
成员函数文档
[constexpr noexcept]
QFlags::QFlags()
构造一个未设置标志的 QFlags 对象。
[constexpr noexcept]
QFlags::QFlags(Enum flags)
构造一个 QFlags 对象,存储flags 。
[constexpr noexcept]
QFlags::QFlags(QFlag flag)
构造一个 QFlags 对象,用整数flag 进行初始化。
QFlag 类型是一种辅助类型。通过使用它而不是int
,我们有效地确保了任意枚举值不能被转换为 QFlags,而未键入的枚举值(即int
值)则可以。
该构造函数仅适用于 32 位Enum
类型。为支持所有枚举大小,可考虑使用std::in_place_t
构造函数。
[constexpr noexcept]
QFlags::QFlags(std::initializer_list<Enum> flags)
构造一个 QFlags 对象,初始化时使用位顺时针 OR 运算符将所有flags 组合在一起。
另请参阅 operator|=() 和operator|()。
[constexpr noexcept, since 6.9]
QFlags::QFlags(std::in_place_t, QFlags<T>::Int flags)
构造一个 QFlags 对象,初始化为整数flags 。
该函数在 Qt 6.9 中引入。
[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]
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 中设置的任何标志也在此 flags 对象中设置,则返回true
,否则返回false
。如果flag 没有设置任何标志,则返回值总是false
。
此函数在 Qt 6.2 中引入。
另请参阅 testFlag() 。
[constexpr noexcept, since 6.2]
bool QFlags::testAnyFlags(QFlags<T> flags) const
如果flags 中设置的任何标志也在此 flags 对象中设置,则返回true
,否则返回false
。如果flags 没有设置任何标志,则返回值总是false
。
此函数在 Qt 6.2 中引入。
另请参阅 testFlags() 。
[constexpr noexcept]
bool QFlags::testFlag(Enum flag) const
如果标志flag 已设置,则返回true
,否则返回false
。
注意: 如果flag 包含多个设置为 1 的比特位(例如,如果它是一个枚举器,等于其他枚举器的比特位-OR),则只有当此标志对象中的所有比特位都被设置时,此函数才会返回true
。另一方面,如果flag 不包含设置为 1 的位(即其整数值为 0),则只有当此 flags 对象也没有设置为 1 的位时,此函数才会返回true
。
另请参见 testAnyFlag()。
[constexpr noexcept, since 6.2]
bool QFlags::testFlags(QFlags<T> flags) const
如果此 flags 对象与给定的flags 匹配,则返回true
。
如果flags 已设置任何标志,则如果flags 中设置的所有标志也在此 flags 对象中设置,则此 flags 对象会精确匹配。否则,当flags 未设置任何标志时,只有当该标志对象也未设置任何标志时,该标志对象才会匹配。
此函数在 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 mask) const
返回一个QFlags 对象,其中包含对该对象和mask 进行位和运算的结果。
如果定义了QT_TYPESAFE_FLAGS
宏,该操作符将被禁用。请注意,对于 64 位QFlags ,它也没有扩展到 64 位:要支持 64 位,请使用类型安全重载。
另请参阅 operator&=()、operator|()、operator^() 和operator~()。
[constexpr noexcept]
QFlags<T> QFlags::operator&(Enum mask) const
这是一个重载函数。
[constexpr noexcept, since 6.2]
QFlags<T> QFlags::operator&(QFlags<T> mask) const
这是一个重载函数。
该函数在 Qt 6.2 中引入。
[constexpr noexcept]
QFlags<T> QFlags::operator&(uint mask) const
这是一个重载函数。
如果定义了QT_TYPESAFE_FLAGS
宏,该操作符将被禁用。请注意,对于 64 位QFlags ,它也没有扩展到 64 位:要支持 64 位,请使用类型安全重载。
[constexpr noexcept]
QFlags<T> &QFlags::operator&=(int mask)
对mask 执行位和运算,并将结果存储在QFlags 对象中。返回此对象的引用。
如果定义了QT_TYPESAFE_FLAGS
宏,该操作符将被禁用。请注意,对于 64 位QFlags ,该操作符也未扩展至 64 位:若要支持 64 位,请使用类型安全重载。
另请参阅 operator&()、operator|=() 和operator^=()。
[constexpr noexcept]
QFlags<T> &QFlags::operator&=(Enum mask)
这是一个重载函数。
[constexpr noexcept, since 6.2]
QFlags<T> &QFlags::operator&=(QFlags<T> mask)
这是一个重载函数。
该函数在 Qt 6.2 中引入。
[constexpr noexcept]
QFlags<T> &QFlags::operator&=(uint mask)
这是一个重载函数。
如果定义了QT_TYPESAFE_FLAGS
宏,该操作符将被禁用。请注意,对于 64 位QFlags ,它也没有扩展到 64 位:要支持 64 位,请使用类型安全重载。
[default]
int &QFlags::operator=(const QFlags<T> &other)
将other 赋值给此对象,并返回此对象的引用。
[constexpr noexcept]
QFlags<T> QFlags::operator^(QFlags<T> other) const
返回QFlags 对象,其中包含对该对象和other 进行比特 XOR 运算的结果。
另请参阅 operator^=()、operator&()、operator|() 和operator~()。
[constexpr noexcept]
QFlags<T> QFlags::operator^(Enum other) const
这是一个重载函数。
[constexpr noexcept]
QFlags<T> &QFlags::operator^=(QFlags<T> other)
与other 执行比特 XOR 运算,并将结果存储在QFlags 对象中。返回此对象的引用。
另请参阅 operator^()、operator&=() 和operator|=()。
[constexpr noexcept]
QFlags<T> &QFlags::operator^=(Enum other)
这是一个重载函数。
[constexpr noexcept]
QFlags<T> QFlags::operator|(QFlags<T> other) const
返回一个QFlags 对象,其中包含对该对象和other 进行位操作 OR 的结果。
另请参见 operator|=()、operator^()、operator&() 和operator~()。
[constexpr noexcept]
QFlags<T> QFlags::operator|(Enum other) const
这是一个重载函数。
[constexpr noexcept]
QFlags<T> &QFlags::operator|=(QFlags<T> other)
对other 执行位顺时针 OR 运算,并将结果存储在QFlags 对象中。返回此对象的引用。
另请参阅 operator|()、operator&=() 和operator^=()。
[constexpr noexcept]
QFlags<T> &QFlags::operator|=(Enum other)
这是一个重载函数。
[constexpr noexcept]
QFlags<T> QFlags::operator~() const
返回一个QFlags 对象,其中包含该对象的按位否定值。
相关非成员
[constexpr noexcept, since 6.2]
template <typename Enum> size_t qHash(QFlags<Enum> key, size_t seed = 0)
返回key 的哈希值,使用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() 宏声明了Flags 的全局operator|()
函数,其类型为QFlags<T>。
详见QFlags 文档。
另请参阅 Q_DECLARE_FLAGS() 。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.