如何解决如何测试值是否对 QFlags 有效
假设我有这个标志:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。