Преобразование 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;
};
Это позволяет мне передавать мои пользовательские переменные денег, содержащиеся в QVariants, чтобы я мог использовать их в системе свойств Qt, структуре модели/представления или модуле sql.
но если мне нужно хранить мои пользовательские деньги переменная в базе данных (с помощью QSqlQuery.addBindValue) это не может быть пользовательский класс, он должен быть известным типом (например, double).
QVariant myMoneyVariant = myqobject.property("myMoneyProperty");
void *myData = myMoneyVariant.data();
CustomType *custType = static_cast<CustomType*>(myData);
QVariant myNewVariant = ct->toVariant();
myNewVariant теперь имеет тип double, а не деньги, поэтому я могу использовать его в базе данных:
myqsqlquery.addBindValue(myNewVariant);
или преобразовать его в строку:
QString s = myNewVariant.toString();
вы уверены, что следующие работы?
вернуться в QString(пределах _value);
Я, кажется, не найти QString
ctor, который принимает 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;
};