我使用QMetaObject
从我的对象获取属性,其中一些属性是指向继承自QObject的类的指针,使用QMetaProperty::read
时我得到了QVariant
包含指向该属性值的指针。
鉴于QVariant
我无法确定基础值是否为空。
我已经编写了一个单元测试来表明问题,假设您已经拥有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;
}
我尝试过的其他一些事情包括:
value.canConvert<QObject*>()
然而这引发了一个段错误value.value<QObject*>() == nullptr
这个也引发了一个段错误value.value<void*>() == nullptr
这总是返回true 我尝试这样做的原因是将任意QObject转换为json,但这在此范围内并不重要。
答案 0 :(得分:1)
经过一些实验后,我发现你只能比较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()
,这样你就不会得到任何误报。