2016-09-16 2 views
3

Я использую QMetaObject получить свойство моего объекта, некоторые из этих свойств являются указателями на классы, которые наследуют QObject, при использовании QMetaProperty::read я вернусь QVariant, содержащий указатель на значение этого свойства.Как определить, если QVariant, представляющий QObject * является нулевым

Учитывая, что 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 это также бросает Segfault
  3. value.value<void*>() == nullptr это всегда возвращает истину

Поэтому я пытаюсь сделать это, чтобы преобразовать произвольные объекты QObject в JSON, но это не важно в этой области ,

+0

Каков тип метатипа для qvariant, вызывающий у вас головную боль? – Yakk

+0

мета тип QObject * – Eluvatar

+0

Можете ли вы дать мне строку кода, которую вы использовали для определения этого? – Yakk

ответ

0

После нескольких экспериментов я обнаружил, что вы можете просто сравнить 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(), а поэтому вы не получите каких-либо ложных срабатываний.

Смежные вопросы