如何测试一个值是否对 QFlags 有效
How to test if a value is valid for a QFlags
假设我有这个标志:
enum MyEnum
{
AAA = 1,
BBB = 2,
CCC = 4,
DDD = 8
};
Q_DECLARE_FLAGS( MyFlags, MyEnum )
Q_FLAG( MyFlags )
如何测试一个值是否有效?
即我预计 -1 或 16 无效。
对于枚举,这可以通过 QMetaEnum::valueToKey 实现,其中 return 是一个 nullptr。
但是对于标志,QMetaEnum::valueToKeys总是return一个字节数组,它有所有标志的组合(看起来是这样)。
有没有办法检查标志的有效性?
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
假设我有这个标志:
enum MyEnum
{
AAA = 1,
BBB = 2,
CCC = 4,
DDD = 8
};
Q_DECLARE_FLAGS( MyFlags, MyEnum )
Q_FLAG( MyFlags )
如何测试一个值是否有效?
即我预计 -1 或 16 无效。
对于枚举,这可以通过 QMetaEnum::valueToKey 实现,其中 return 是一个 nullptr。 但是对于标志,QMetaEnum::valueToKeys总是return一个字节数组,它有所有标志的组合(看起来是这样)。
有没有办法检查标志的有效性?
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