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

3
我正在使用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。

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


导致你头疼的 QVariant 的元类型是什么类型? - Yakk - Adam Nevraumont
元类型是QObject* - Eluvatar
你能给我你用来确定的那行代码吗? - Yakk - Adam Nevraumont
调用variant1.typeName()会返回元类型的字符串,你也可以调用.type()来获取枚举。 - Eluvatar
1个回答

2

经过一些实验,我发现你可以比较两个QVariant,如果它们都表示空指针,它将返回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(),以避免出现误报。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接