2009-03-17 5 views
8

Tengo una clase personalizada llamada Money que he declarado con Q_DECLARE_METATYPE().Convierta un QVariant de un tipo personalizado a QString

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); 

almaceno que en un QVariant y quiero convertirlo en un QString:

QVariant v = QVariant::fromValue(m); 

QString s = v.toString(); 

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

Respuesta

4

Bien Encontré una forma de hacerlo. que creó un tipo llamado padre CustomType con un método virtual que puedo aplicar para convertir mi tipo personalizado a un QVariant "normal":

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

entonces heredado mi clase de dinero encargo 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 de dinero personalizados contenidos en QVariants para que pueda utilizarlos en el sistema de Qt propiedad, modelo/marco de la vista, o el módulo de SQL.

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

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

myNewVariant tiene ahora el tipo de matrimonio, no el dinero para que pueda utilizarlo en una base de datos:

myqsqlquery.addBindValue(myNewVariant); 

o convertirla en una cadena:

QString s = myNewVariant.toString(); 
+4

Creo que el método void * QVariant :: data() no está en la documentación de Qt. – darkadept

-1

¿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; 
}; 
+0

¿Estás seguro puede llamar a un método en un tipo de datos nativo? – dirkgently

+0

No. double no tiene un método .toString(). Eso no funcionaria – darkadept

+0

Simplemente reemplace el return _value.toString(); por vuelta QVariant :: number (_value); – Doodloo

0

¿Estás seguro de que los siguientes funcionan?

return QString (_value);

No parece encontrar un QString ctor que toma un double. Tendrá que hacer la conversión aquí usted mismo. La forma de Qt es:

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

Tienes razón, no hay ningún código que tenga un doble. Debería haber escrito esa línea como "return QString :: number (_value);" – darkadept

+0

Cualquiera de los dos debe solucionar su problema. – dirkgently

+0

QVariant consume más memoria. QString :: number (_value) es una mejor solución. –