QFlags Class
template <typename Enum> class QFlagsQFlags 类提供了一种类型安全的方式来存储枚举值的“或”组合。更多内容...
| 头文件: | #include <QFlags> |
| CMake: | 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 |
| 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) |
(since 6.2) bool | operator!=(Enum lhs, QFlags<T> rhs) |
(since 6.2) bool | operator!=(QFlags<T> lhs, Enum rhs) |
(since 6.2) bool | operator!=(QFlags<T> lhs, QFlags<T> rhs) |
(since 6.2) bool | operator==(Enum lhs, QFlags<T> rhs) |
(since 6.2) bool | operator==(QFlags<T> lhs, Enum rhs) |
(since 6.2) bool | operator==(QFlags<T> lhs, QFlags<T> rhs) |
宏
| Q_DECLARE_FLAGS(Flags, Enum) | |
| Q_DECLARE_OPERATORS_FOR_FLAGS(Flags) |
详细说明
QFlags<ENUM> 是一个模板类,其中Enum 是一个枚举类型。QFlags 在整个 Qt 中用于存储枚举值的组合。
C++ 中存储枚举值“或”组合的传统方法是使用int 或uint 变量。这种方法的不便之处在于完全没有类型检查;任何枚举值都可以与其他枚举值进行“或”运算,并传递给接受int 或uint 作为参数的函数。
自 Qt 6.9 起,QFlags 支持 64 位枚举。当枚举位数超过 32 位时,建议使用显式(固定)的底层类型,以确保在移除某个枚举项时,枚举本身和 QFlags 类型的大小均不会发生变化。 此外,某些编译器仅在显式指定底层类型时,才会将enum 类型扩展至32位以上。
Qt::AlignmentFlagQt 使用 QFlags 来提供类型安全性。例如,Qt::Alignment 类型只是对 QFlags<XML-ph-0001@deepl.internal> 的 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()。此时,Q_DECLARE_FLAGS() 必须与相应的枚举位于同一作用域(类或命名空间)内。
示例:
class MyClass_1
{
public:
enum Option {
NoOptions = 0x0,
ShowTabs = 0x1,
ShowAll = 0x2,
SqueezeBlank = 0x4
};
Q_DECLARE_FLAGS(Options, Option)
//...
};
Q_DECLARE_OPERATORS_FOR_FLAGS(MyClass_1::Options)然后,您可以使用MyClass::Options 类型来存储MyClass::Option 值的组合。
标志与元对象系统
Q_DECLARE_FLAGS() 宏不会将标志暴露给元对象系统,因此 Qt Script 无法使用这些标志,也无法在Qt Widgets Designer 中对其进行编辑。若要使这些标志可用于上述目的,必须使用Q_FLAG() 宏:
class MyClass_2
{
Q_OBJECT
public:
enum Option {
NoOptions = 0x0,
ShowTabs = 0x1,
ShowAll = 0x2,
SqueezeBlank = 0x4
};
Q_DECLARE_FLAGS(Options, Option)
Q_FLAG(Options)
//...
};
Q_DECLARE_OPERATORS_FOR_FLAGS(MyClass_2::Options)命名约定
针对枚举类型及其关联的 QFlags 类型,合理的命名约定是:为枚举类型赋予单数名称(例如Option ),而为 QFlags 类型赋予复数名称(例如Options )。 若希望 QFlags 类型采用单数名称(例如:Alignment ),可将Flag 作为枚举类型的后缀(例如:AlignmentFlag )。
成员类型文档
[alias] QFlags::Int
用于存储和隐式转换的整数类型的类型别名。具体为qintXX 或quintXX ,这取决于枚举的底层类型是带符号还是无符号,以及(自 Qt 6.9 起)枚举的大小。通常情况下,它会是qint32 (int )或quint32 (unsigned )。
QFlags::enum_type
枚举模板类型的 typedef。
成员函数文档
[constexpr noexcept default] QFlags::QFlags()
创建一个未设置任何标志的 QFlags 对象。
[constexpr noexcept] QFlags::QFlags(Enum flags)
创建一个 QFlags 对象,用于存储flags 。
[constexpr noexcept] QFlags::QFlags(QFlag flag) requires (sizeof(Enum) == sizeof(int))
构建一个初始化值为整数flag 的QFlags对象。
QFlag 类型是一种辅助类型。在此处使用它而非int ,可以有效确保任意枚举值无法被强制转换为 QFlags,而未指定类型的枚举值(即int 值)则可以。
此构造函数仅适用于 32 位的Enum 类型。若要支持所有枚举大小,请考虑使用std::in_place_t 来构建。
[constexpr noexcept] QFlags::QFlags(std::initializer_list<Enum> flags)
构建一个 QFlags 对象,该对象通过位或运算符将所有flags 组合后进行初始化。
另请参阅 operator|=() 和operator|()。
[constexpr noexcept, since 6.9] QFlags::QFlags(std::in_place_t, QFlags<T>::Int flags)
创建一个初始化值为整数flags 的QFlags对象。
该函数在 Qt 6.9 中引入。
[implicit] QFlags::QFlags(const QFlags<T> &other)
创建other 的副本。
[static constexpr noexcept, since 6.2] QFlags<T> QFlags::fromInt(QFlags<T>::Int i)
创建一个QFlags 对象,该对象表示整数值i 。
该函数于 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 中设置的任何标志在此标志对象中也已设置,则返回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 。
true 注意:如果 flag 中有多个位被设为 1(例如,如果它是一个等于其他枚举器按位或运算结果的枚举器),则该函数仅当该标志对象中的所有位均被设为 1 时,才会返回true 。 另一方面,如果flag 中没有位被设为1(即其作为整数的值为0),则该函数仅当此flags对象中也没有位被设为1时,才返回 。
另请参阅 testAnyFlag()。
[constexpr noexcept, since 6.2] bool QFlags::testFlags(QFlags<T> flags) const
如果该标志对象与给定的flags 匹配,则返回true 。
如果 `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::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 执行按位与(AND)运算,并将结果存储在此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 位支持,请使用类型安全的重载。
这是一个重载函数。
[implicit] int &QFlags::operator=(const QFlags<T> &other)
将other 赋值给此对象,并返回对此对象的引用。
[constexpr noexcept] QFlags<T> QFlags::operator^(QFlags<T> other) const
返回一个QFlags 对象,其中包含该对象与other 进行位异或运算后的结果。
另请参阅 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 进行位或运算后的结果。
另请参阅 operator|=()、operator^()、operator&() 以及operator~()。
[constexpr noexcept] QFlags<T> QFlags::operator|(Enum other) const
这是一个重载函数。
[constexpr noexcept] QFlags<T> &QFlags::operator|=(QFlags<T> other)
与other 执行位或运算,并将结果存储在此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 起引入。
[constexpr noexcept, since 6.2] bool operator!=(Enum lhs, QFlags<T> rhs)
[constexpr noexcept, since 6.2] bool operator!=(QFlags<T> lhs, Enum rhs)
[constexpr noexcept, since 6.2] bool operator!=(QFlags<T> lhs, QFlags<T> rhs)
用于比较lhs 和rhs 是否相等;如果这两个参数不表示完全相同的值(位掩码),则视为不同。
这些函数是在 Qt 6.2 中引入的。
[constexpr noexcept, since 6.2] bool operator==(Enum lhs, QFlags<T> rhs)
[constexpr noexcept, since 6.2] bool operator==(QFlags<T> lhs, Enum rhs)
[constexpr noexcept, since 6.2] bool operator==(QFlags<T> lhs, QFlags<T> rhs)
比较lhs 和rhs 是否相等;如果这两个参数表示完全相同的值(位掩码),则被视为相等。
这些函数在 Qt 6.2 中引入。
宏文档
Q_DECLARE_FLAGS(Flags, Enum)
宏 Q_DECLARE_FLAGS() 展开后为
typedef QFlags<Enum> Flags;Enum 是现有枚举类型的名称,而Flags 则是QFlags<Enum> typedef 的名称。
详情请参阅QFlags 文档。
另请参阅 Q_DECLARE_OPERATORS_FOR_FLAGS()。
Q_DECLARE_OPERATORS_FOR_FLAGS(Flags)
宏 Q_DECLARE_OPERATORS_FOR_FLAGS() 声明了全局位运算符函数operator|() 、operator&() 、operator^() 、operator~() 及其赋值形式:&=、|= 和 ^=。这些函数适用于Flags ,其类型为QFlags<T>。
详情请参阅QFlags 文档。
另请参阅 Q_DECLARE_FLAGS()。
© 2026 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.