Преобразовать QVariant пользовательского типа в QString
У меня есть собственный класс с именем Money, который я объявил с помощью Q_DECLARE_METATYPE().
class Money {
public:
Money(double d) {
_value = d;
}
~Money() {}
QString toString() const {
return QString(_value);
}
private:
double _value;
};
Q_DECLARE_METATYPE(Money);
Money m(23.32);
Я храню это в QVariant, и я хочу преобразовать его в QString:
QVariant v = QVariant::fromValue(m);
QString s = v.toString();
Переменная s оказывается пустой строкой, потому что QVariant не знает, как преобразовать мой пользовательский тип в строку. Есть какой-либо способ сделать это?
3 ответа
Хорошо, я нашел один способ сделать это. Я создал родительский тип с именем CustomType с помощью виртуального метода, который я могу реализовать для преобразования моего пользовательского типа в "нормальный" QVariant:
class CustomType {
public:
virtual ~CustomType() {}
virtual QVariant toVariant() const { return QVariant(); }
};
Затем я унаследовал свой собственный класс Money от этого.
class Money : public CustomType {
public:
Money(double d) {
_value = d;
}
~Money() {}
QVariant toVariant() {
return QVariant(_value);
}
private:
double _value;
};
Это позволяет мне передавать свои собственные переменные Money, содержащиеся в QVariants, чтобы я мог использовать их в системе свойств Qt, каркасе модели / представления или модуле sql.
Но если мне нужно сохранить свою пользовательскую переменную Money в базе данных (используя QSqlQuery.addBindValue), это не может быть пользовательский класс, это должен быть известный тип (например, double).
QVariant myMoneyVariant = myqobject.property("myMoneyProperty");
void *myData = myMoneyVariant.data();
CustomType *custType = static_cast<CustomType*>(myData);
QVariant myNewVariant = ct->toVariant();
myNewVariant теперь имеет тип double, а не Money, поэтому я могу использовать его в базе данных:
myqsqlquery.addBindValue(myNewVariant);
или преобразовать его в строку:
QString s = myNewVariant.toString();
Вы уверены, что следующие работы?
return QString (_value);
Кажется, я не нахожу QString
Котор, который принимает double
, Вам придется сделать здесь преобразование самостоятельно. Способ Qt состоит в том, чтобы:
QString toString() const {
QVariant d(_value);
return d.ToQString();
}
Что произойдет, если вы попробуете это так?
class Money {
public:
Money(double d) {
_value = d;
}
~Money() {}
QString toString() const {
return _value.toString();
}
private:
double _value;
};