Convertir une QVariant d'un type personnalisé en QString
Question
J'ai une classe personnalisée appelée Money que j'ai déclarée avec 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);
Je stocke cela dans un QVariant et je veux le convertir en QString:
QVariant v = QVariant::fromValue(m);
QString s = v.toString();
La Variable s finit par être une chaîne nulle, car QVariant ne sait pas convertir mon type personnalisé en chaîne. Y a-t-il un moyen de le faire?
La solution
Ok, j'ai trouvé un moyen de faire ça. J'ai créé un type parent appelé CustomType avec une méthode virtuelle que je peux implémenter pour convertir mon type personnalisé en un fichier "normal". QVariant:
class CustomType {
public:
virtual ~CustomType() {}
virtual QVariant toVariant() const { return QVariant(); }
};
J'ai ensuite hérité de ma classe Money personnalisée.
class Money : public CustomType {
public:
Money(double d) {
_value = d;
}
~Money() {}
QVariant toVariant() {
return QVariant(_value);
}
private:
double _value;
};
Cela me permet de transmettre mes variables Money personnalisées contenues dans QVariants afin de pouvoir les utiliser dans le système de propriétés Qt, le cadre modèle / vue ou le module SQL.
Mais si j'ai besoin de stocker ma variable Money personnalisée dans la base de données (à l'aide de QSqlQuery.addBindValue), elle ne peut pas être une classe personnalisée, il doit s'agir d'un type connu (comme double).
QVariant myMoneyVariant = myqobject.property("myMoneyProperty");
void *myData = myMoneyVariant.data();
CustomType *custType = static_cast<CustomType*>(myData);
QVariant myNewVariant = ct->toVariant();
myNewVariant a maintenant le type de double, pas Money, je peux donc l'utiliser dans une base de données:
myqsqlquery.addBindValue(myNewVariant);
ou le convertir en chaîne:
QString s = myNewVariant.toString();
Autres conseils
Êtes-vous sûr que les solutions suivantes fonctionnent?
retourne QString (_value);
Je ne semble pas avoir trouvé de marqueur QString
prenant un double
. Vous devrez faire la conversion ici vous-même. La méthode Qt consiste à:
QString toString() const {
QVariant d(_value);
return d.ToQString();
}
Que se passe-t-il si vous essayez de cette façon?
class Money {
public:
Money(double d) {
_value = d;
}
~Money() {}
QString toString() const {
return _value.toString();
}
private:
double _value;
};