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

时间:2016-09-16 22:09:04

标签: c++ qt

我使用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;
}

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

  1. value.canConvert<QObject*>()然而这引发了一个段错误
  2. value.value<QObject*>() == nullptr这个也引发了一个段错误
  3. value.value<void*>() == nullptr这总是返回true
  4. 我尝试这样做的原因是将任意QObject转换为json,但这在此范围内并不重要。

1 个答案:

答案 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(),这样你就不会得到任何误报。