Russian Qt Forum

Qt => Общие вопросы => Тема начата: ритт от Апрель 30, 2008, 02:52



Название: QVariant
Отправлено: ритт от Апрель 30, 2008, 02:52
захотел странного: имею переменную типа QVariant::Type и надо создать пустой валидный QVariant для этого типа. причём, совсем не хочется явно кастить его, например, через QVariant::toInt или QVariant::toString

сейчас приходится пользоваться подобной конструкцией:
Код:
QVariant::Type type;
//...
QVariant value;
swicth(type)
{
    case QVariant::Int: value = QVariant(0); break;
    case QVariant::Double: value = QVariant(0.0); break;
//...
    case QVariant::String: value = QVariant(QString("")); break;
    default: break;
}

а хочется как-нибудь легко и изящно
что-нибудь вроде
Код:
QVariant value;
value.convert(type)
, только с валидным результатом на выходе


Название: Re: QVariant
Отправлено: Sergeich от Апрель 30, 2008, 03:33
Гммм...
Цитировать
QVariant::QVariant ( Type type )

Constructs a null variant of type type.
не канает?


Название: Re: QVariant
Отправлено: ритт от Апрель 30, 2008, 04:18
я забыл упомянуть одну маленькую деталь :)
результат нужен не просто валидный, но ещё и не нулл

Код:
QVariant value(QVariant::String);
qWarning() << value << value.isValid() << value.isNull();
QVariant value1(QString(""));
qWarning() << value1 << value1.isValid() << value1.isNull();
даст в результате
Цитировать
QVariant(QString, "") true true
QVariant(QString, "") true false

а для
Код:
QVariant value(QVariant::String);
qWarning() << value << value.isValid() << value.isNull();
QSqlField f("fname", QVariant::String);
f.setValue(value);
QSqlDatabase db;
qWarning() << db.driver()->formatValue(f);
даст на выходе нулл, а не пустую квотрированную строку

и башка не соображает как можно и можно ли вообще избавиться от этого изНулл в варианте


Название: Re: QVariant
Отправлено: Zmeishe от Май 16, 2008, 12:54
А если породить своего наследника от QVariant? Добавить конструктор с нужным типом и прямо там разрулить Null и Valid.


Название: Re: QVariant
Отправлено: ритт от Май 16, 2008, 13:53
будет фактически то же самое, что и в свитче...только в другом блоке кода
ни в ассистанте, ни в сорцах такой возможности не нашёл - видимо, никому не нужно