2016-09-16 3 views
3

私のオブジェクトからプロパティを取得するのにQMetaObjectを使用していますが、これらのプロパティの一部はQObjectから継承したクラスへのポインタですQMetaProperty::readQVariantそのプロパティの値へのポインタQObject *を表すQVariantがnullであるかどうかを調べるには

と仮定すると、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*>()しかし、このスローSA
  2. value.value<QObject*>() == nullptrこれをセグメンテーションフォールトもセグメンテーション違反
  3. value.value<void*>() == nullptr、これは常に真

私はこれをやろうとしている理由は、JSONに任意のQObjectを変換することですが、それはこのスコープでは重要ではありませんを返します。

+0

頭痛を引き起こすqvariantのメタタイプタイプは何ですか? – Yakk

+0

メタタイプがQObject * – Eluvatar

+0

あなたはそれを決定するために使用したコード行を教えてくれますか? – Yakk

答えて

0

2つのQVariantを比較することができます。両方ともnullポインタを表す場合は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()呼び出すこともできます。

関連する問題