问题描述
假设我有这个标志:
enum MyEnum
{
AAA = 1,BBB = 2,CCC = 4,DDD = 8
};
Q_DECLARE_FLAGS( MyFlags,MyEnum )
Q_FLAG( MyFlags )
如何测试一个值是否有效?
即我原以为 -1 或 16 是无效的。
对于枚举,这可以通过返回 nullptr 的 QMetaEnum::valueToKey 来实现。 但是对于标志,QMetaEnum::valueToKeys 总是返回一个字节数组,它包含所有标志的组合(看起来是这样)。
有没有办法检查标志的有效性?
解决方法
implementation 看起来像是对枚举值的简单 AND 运算。因此,在 -1 (0x FFFF FFFF) 的情况下,QMetaEnum::valueToKeys()
的输出将为 AAA|BBB|CCC|DDD
。在 16 (0b 0001 0000) 的情况下,返回一个空字节数组。
检查初始值有效性的一种方法是使用 QMetaEnum::keysToValue()
将返回的键转换回值。如果 QMetaEnum::keysToValue()
的返回值等于初始值,则初始值应该有效。
#include "mainwindow.h"
#include <QMetaEnum>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
auto meta_enum = QMetaEnum::fromType<MyFlags>();
int value_before = 17;
QByteArray keys = meta_enum.valueToKeys(value_before);
qDebug() << keys;
int value_after = meta_enum.keysToValue(keys);
qDebug() << value_after;
}
MainWindow::~MainWindow()
{
}
在上面的代码中,对于初始值 17 (0b 0001 0001),返回的键是 AAA
,而 value_after
是 1