如何测试一个值是否对 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),返回的键是AAAvalue_after是1