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?

Était-ce utile?

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;
};
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top