Convertir un QVariant d'un type personnalisé pour un QString
J'ai une classe personnalisée appelé l'Argent que j'ai déclaré 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 la stocker dans un QVariant et je veux le convertir en un QString:
QVariant v = QVariant::fromValue(m);
QString s = v.toString();
Variable s finit par être une chaîne nulle, car QVariant ne sais pas comment faire pour convertir mon type personnalisé pour la chaîne. Est-il possible de faire cela?
OriginalL'auteur darkadept | 2009-03-17
Vous devez vous connecter pour publier un commentaire.
Ok j'ai trouvé une façon de le faire.
J'ai créé un type parent appelé CustomType avec une méthode virtuelle que je peux mettre en œuvre pour convertir mon type personnalisé pour un "normal" QVariant:
J'ai ensuite hérité de mon personnalisée de l'Argent de la classe de ce.
Cela me permet de passer mon personnalisée de l'Argent des variables contenues dans QVariants afin que je puisse les utiliser dans l'intervalle Qt système de propriété, modèle/vue-cadre ou le module sql.
Mais si j'ai besoin de stocker mes personnalisé de l'Argent de la variable dans la base de données (à l'aide de QSqlQuery.addBindValue) il ne peut pas être une classe personnalisée, il doit être d'un type connu (le double).
myNewVariant a maintenant le type de double, pas d'Argent donc je peux l'utiliser dans une base de données:
ou la convertir en une chaîne de caractères:
OriginalL'auteur darkadept
Êtes-vous sûr que les œuvres suivantes?
Je ne semble pas trouver un
QString
ctor qui prend undouble
. Vous aurez à faire la conversion ici vous-même. L'intervalle Qt moyen est de:Soit devrait résoudre votre problème.
QVariant consomme plus de mémoire. QString::number(_value) est une meilleure solution.
OriginalL'auteur dirkgently
Ce qui se passe si vous essayez de cette façon?
Nope. double n'ont pas .la méthode toString (). Cela ne fonctionnerait pas.
Il suffit de remplacer le retour _value.toString(); par retour de QVariant::nombre(_value);
OriginalL'auteur MarkusQ