我正在使用
鉴于这个
我编写了一个单元测试来展示这个问题,假设您已经拥有了
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。
我尝试这样做的原因是将任意QObjects转换为json,但在此范围内这并不重要。
variant1.typeName()
会返回元类型的字符串,你也可以调用.type()
来获取枚举。 - Eluvatar