Pregunta

Tengo una clase personalizada llamada Money que he declarado con 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);

Lo guardo en un QVariant y quiero convertirlo en un QString:

QVariant v = QVariant::fromValue(m);

QString s = v.toString();

La variable s termina siendo una cadena nula porque QVariant no sabe cómo convertir mi tipo personalizado a la cadena. ¿Hay alguna forma de hacer esto?

¿Fue útil?

Solución

Ok, encontré una forma de hacer esto. Creé un tipo primario llamado CustomType con un método virtual que puedo implementar para convertir mi tipo personalizado a un "normal". QVariant:

class CustomType {
public:
  virtual ~CustomType() {}
  virtual QVariant toVariant() const { return QVariant(); }
};

Entonces heredé mi clase personalizada de Money de esto.

class Money : public CustomType {
public:
  Money(double d) {
    _value = d;
  }
  ~Money() {}
  QVariant toVariant() {
    return QVariant(_value);
  }
private:
  double _value;
};

Esto me permite pasar mis variables personalizadas de Money contenidas en QVariants para poder usarlas en el sistema de propiedades Qt, el modelo / marco de vista o el módulo sql.

Pero si necesito almacenar mi variable personalizada de Money en la base de datos (usando QSqlQuery.addBindValue) no puede ser una clase personalizada, debe ser un tipo conocido (como double).

QVariant myMoneyVariant = myqobject.property("myMoneyProperty");
void *myData = myMoneyVariant.data();
CustomType *custType = static_cast<CustomType*>(myData);
QVariant myNewVariant = ct->toVariant();

myNewVariant ahora tiene el tipo de doble, no Money, por lo que puedo usarlo en una base de datos:

myqsqlquery.addBindValue(myNewVariant); 

o conviértalo a una cadena:

QString s = myNewVariant.toString();

Otros consejos

¿Está seguro de que lo siguiente funciona?

  

return QString (_value);

Parece que no encuentro un ctor QString que tome un double . Tendrá que hacer la conversión aquí usted mismo. La forma Qt es:

QString toString() const {
 QVariant d(_value);
 return d.ToQString();
}

¿Qué sucede si lo intentas de esta manera?

class Money {
public:
  Money(double d) {
    _value = d;
  }
  ~Money() {}
  QString toString() const {
    return _value.toString();
  }
private:
  double _value;
};
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top