Если вы собираетесь использовать пользовательские типы в QVariant, вы должны использовать функцию-член userType :
К сожалению, это сделает все хуже:
auto u = [](auto& v){return static_cast<int>(v);};
switch(values[i].userType())
{
case u(QVariant::Bool): logic; break;
case u(QVariant::Int): logic; break;
case u(QVariant::LongLong): logic; break;
case u(QVariant::String): logic; break;
case u(QVariant::Double): logic; break;
case u(QVariant::DateTime):
case u(QVariant::Date):
case u(QVariant::Time): logic; break;
case u(QVariant::User)+1:
{
logic;break;
}
case u(QVariant::User)+2:
{
logic;break;
}
default: break;
}
Для пояснения: обратите внимание, что функция-член type()
всегда будет возвращать QVariant::UserType
, когда значение типа больше QMetaType::User
. Это означает, что он никогда не вернется QVariant::UserType+n
! Как это могло? Эти значения не являются частью перечисления.
Вот о чем вас предупреждает gcc:
warning: case value ‘1025’ not in enumerated type ‘QVariant::Type’ [-Wswitch]
Поскольку 1025
(QVariant::User+1
) не является частью QVariant::Type
, эта метка регистра по сути является мертвым кодом.
Функция-член userType
, однако, возвращает int
. Он вернет то же базовое значение, что и type
, если это значение ниже QMetaType::User
, а также правильное пользовательское значение, если оно выше.