2009-03-17 15 views
8

Ho una classe personalizzata chiamata Money che ho dichiarato con Q_DECLARE_METATYPE().Convertire una QVariant di un tipo personalizzato in una 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); 

ho negozio che in un QVariant e voglio convertirlo in un QString:

QVariant v = QVariant::fromValue(m); 

QString s = v.toString(); 

variabile s finisce per essere una stringa nulla perché QVariant non sa come convertire il mio tipo personalizzato alla stringa. C'è un modo per fare questo?

risposta

4

Ok, ho trovato un modo per farlo. Ho creato un tipo genitore chiamato CustomType con un metodo virtuale che posso attuare per convertire il mio tipo personalizzato ad un QVariant "normale":

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

Poi ho ereditato la mia classe di denaro personalizzato da questo.

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

Questo mi permette di passare le mie variabili denaro personalizzati contenuti nel QVariants modo che io possa utilizzare nel sistema Qt proprietà, modello/vista quadro, o il modulo SQL.

Ma se ho bisogno di memorizzare la mia variabile Money personalizzata nel database (usando QSqlQuery.addBindValue) non può essere una classe personalizzata, deve essere di tipo noto (come il doppio).

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

myNewVariant ha ora il tipo di doppio, non il denaro in modo da posso usarlo in un database:

myqsqlquery.addBindValue(myNewVariant); 

o convertirlo in una stringa:

QString s = myNewVariant.toString(); 
+4

Penso che il metodo void * QVariant :: data() non sia nella documentazione Qt. – darkadept

-1

Cosa succede se lo provi in ​​questo modo?

class Money { 
public: 
    Money(double d) { 
    _value = d; 
    } 
    ~Money() {} 
    QString toString() const { 
    return _value.toString(); 
    } 
private: 
    double _value; 
}; 
+0

Sicura puoi chiamare un metodo su un tipo di dati nativo? – dirkgently

+0

No. double non ha un metodo .toString(). Non funzionerebbe. – darkadept

+0

Basta sostituire il valore restituito _value.toString(); di ritorno QVariant :: number (_value); – Doodloo

0

Sei sicuro che i seguenti lavori?

ritorno QString (_valore);

Non riesco a trovare uno QString ctor che prende uno double. Dovrai fare la conversione qui da te. Il modo Qt è:

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

Hai ragione, non esiste un operatore che prenda un doppio. Avrei dovuto scrivere quella riga come "return QString :: number (_value);" – darkadept

+0

Entrambi dovrebbero risolvere il problema. – dirkgently

+0

QVariant consuma più memoria. QString :: number (_value) è una soluzione migliore. –

Problemi correlati