微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何测试值是否对 QFlags 有效

如何解决如何测试值是否对 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 举报,一经查实,本站将立刻删除。