Russian Qt Forum
Ноябрь 23, 2024, 08:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сравнение с QVariant  (Прочитано 4718 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Июль 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. Как это лучше сделать?

Спасибо
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1 : Июль 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);
}
 
Так работает?
Записан
AkonResumed
Чайник
*
Offline Offline

Сообщений: 81


Просмотр профиля
« Ответ #2 : Июль 12, 2020, 08:28 »

template<class T>
bool SameValue( const QVariant & v, const T & value )
{
   return v.canConvert<T>(value) && (v.value<T>() == value);
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июль 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. Или с новыми стандартами все-таки "можна"?  Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Июль 12, 2020, 10:45 »

Очень похоже, что Qt сам регистрирует QMatrix3x3

Нужно только сравнивать v.userType() с qMetaTypeId<QMatrix3x3>()
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.098 секунд. Запросов: 22.