Russian Qt Forum

Qt => Общие вопросы => Тема начата: Igors от Июль 11, 2020, 08:13



Название: Сравнение с QVariant
Отправлено: Igors от Июль 11, 2020, 08:13
Добрый день

Нарисовал так
Код
C++ (Qt)
template<class T>
bool SameValue( const QVariant & v, const T & value )
{
 QVariant v2;
 v2.setValue(value);
 return (v.type() == v2.type()) && (v.value<T>() == value);
}
 
Как-то коряво. Требуется сравнить без возможного convert. Как это лучше сделать?

Спасибо


Название: Re: Сравнение с QVariant
Отправлено: __Heaven__ от Июль 11, 2020, 11:37
Код
C++ (Qt)
template<class T>
bool SameValue( const QVariant & v, const T & value )
{
 return (v.type() == qMetaTypeId<T>()) && (v.value<T>() == value);
}
 
Так работает?


Название: Re: Сравнение с QVariant
Отправлено: AkonResumed от Июль 12, 2020, 08:28
template<class T>
bool SameValue( const QVariant & v, const T & value )
{
   return v.canConvert<T>(value) && (v.value<T>() == value);
}


Название: Re: Сравнение с QVariant
Отправлено: Igors от Июль 12, 2020, 09:09
template<class T>
bool SameValue( const QVariant & v, const T & value )
{
   return v.canConvert<T>(value) && (v.value<T>() == value);
}
canСonvert наоборот, не нужно, требуется  float(0) != int(0)

Код:
  return (v.type() == qMetaTypeId<T>()) && (v.value<T>() == value);
Да, оно, глянул в отладчике - именно так заряжается type в setValue. Спасибо

Правда возникают мелкие непрятности - не могу свитчеваться
Код
C++ (Qt)
switch (v.type()) {
...
 
case (QVariant::Type) QMetaType::QMatrix4x4:   // Ok, такой имеется
SetUniformMatr4(name, v.value<QMatrix4x4>());
break;
 
case (QVariant::Type) QMetaType::QMatrix3x3:   // error: а Чебурашки нет :-(
SetUniformMatr3(name, v.value<QMatrix3x3>());
  break;
 
default:
Q_ASSERT(0);
break;
}
 
Ну наверно это непобедимо т.к. metaType регистрируется в runtime. Или с новыми стандартами все-таки "можна"?  :)


Название: Re: Сравнение с QVariant
Отправлено: __Heaven__ от Июль 12, 2020, 10:45
Очень похоже, что Qt сам регистрирует QMatrix3x3

Нужно только сравнивать v.userType() с qMetaTypeId<QMatrix3x3>()