gpt4 book ai didi

c++ - 如何确定表示 QObject* 的 QVariant 是否为空

转载 作者:太空狗 更新时间:2023-10-29 22:58:47 28 4
gpt4 key购买 nike

我正在使用 QMetaObject从我的对象中获取属性,其中一些属性是指向从 QObject 继承的类的指针,当使用 QMetaProperty::read 时我得到一个QVariant包含指向该属性值的指针。

鉴于QVariant我无法确定基础值是否为 null。

我已经编写了一个单元测试来显示问题,假设您已经拥有 QVariant

TEST(utilsTests, isNull)
{
QObject* object1 = new QObject();
QObject* object2 = nullptr;
EXPECT_NE(nullptr, object1);
EXPECT_TRUE(object2 == nullptr);
QVariant variant1 = QVariant::fromValue(object1);
QVariant variant2 = QVariant::fromValue(object2);
EXPECT_FALSE(Utils::isNull(variant1));//test passes
EXPECT_TRUE(Utils::isNull(variant2));//test fails
}

下面是我为实现 Utils::isNull 所做的尝试

bool Utils::isNull(QVariant value)
{
return value.isNull() ||
value.data() == nullptr ||
value.data() == NULL ||
value.data_ptr().is_null == 1 ||
value == QVariant() ||
value == NULL;
}

我尝试过的其他一些事情包括:

  1. value.canConvert<QObject*>()然而这会引发段错误
  2. value.value<QObject*>() == nullptr这 a 也会引发段错误
  3. value.value<void*>() == nullptr这总是返回 true

我尝试这样做的原因是将任意 QObject 转换为 json,但这在这个范围内并不重要。

最佳答案

经过更多的实验,我发现你可以只比较 2 个 QVariants,如果它们都代表一个空指针,它将返回 true,否则返回 false。我对 isNull 的最终实现如下所示:

bool Utils::isNull(QVariant value)
{
//declaring a static variable here, it only get's initlized the first time
static QVariant nullVariant = QVariant::fromValue((QObject * const)nullptr);
return value == nullVariant;
}

您可能还想调用 value.isNull(),这样您就不会得到任何误报。

关于c++ - 如何确定表示 QObject* 的 QVariant 是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39540771/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com