枚举要使用2的幂
原理:确保每个枚举值在二进制表示中都只有一个位被设置为1。这种表示方法允许我们使用按位或(|)操作来组合不同的枚举值,而不会出现重叠或覆盖现象。换句话说,这样我们可以在一个变量中同时表示多个选项。我们可以看到通过按位或操作组合了选项2(二进制0010)和选项4(二进制0100),得到了一个新的值6(二进制0110),这个值同时表示选项2和选项4。由于每个选项都有一个唯一的位设置为1,我们可以清楚地识别出哪些选项被组合在一起。
0001 //2^0 = 1
0010 //2^1 = 2
0100 //2^2 = 4
1000 //2^3 = 8
0010 (2) // Option 2
0100 (4) // Option 4
-------
0110 (6) // Combination of Option 2 and Option 4
Q_DECLARE_FLAGS 宏用于声明一个标志类型(flags type),它基于已定义的枚举类型。标志类型是一种可以存储枚举类型值的组合(通过按位或操作组合)的类型。这允许您在一个变量中存储多个枚举值,并在需要时检查这些值的存在。
例子
#include <QObject>
class FileAccess : public QObject
{
Q_OBJECT
public:
enum class FileMode {
ReadOnly = 0x1,
WriteOnly = 0x2,
ReadWrite = ReadOnly | WriteOnly,
Append = 0x4
};
Q_ENUM(FileMode)
// ...
};
Q_DECLARE_FLAGS(FileModes, FileAccess::FileMode) //FileModes modes = FileAccess::FileMode::ReadWrite | FileAccess::FileMode::Append;
Q_DECLARE_OPERATORS_FOR_FLAGS(FileModes) //用于转为Qvariant
要检查 modes 是否包含特定的模式,可以使用按位与操作(&)
if (modes & FileAccess::FileMode::ReadOnly) {
// ReadOnly 模式存在于 modes 中
}
if (modes & FileAccess::FileMode::Append) {
// Append 模式存在于 modes 中
}