2009-03-17 9 views
8

Ich habe eine benutzerdefinierte Klasse namens Money, die ich mit Q_DECLARE_METATYPE() deklariert habe.Konvertieren einer QVariante eines benutzerdefinierten Typs in einen 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); 

ich speichern, dass in einem QVariant und ich es zu einem QString konvertieren möchten:

QVariant v = QVariant::fromValue(m); 

QString s = v.toString(); 

Variable s endet eine leere Zeichenfolge sein, weil QVariant weiß nicht, wie meine konvertieren benutzerdefinierter Typ für die Zeichenfolge Gibt es eine Möglichkeit, dies zu tun?

Antwort

4

Ok Ich fand einen Weg, dies zu tun. habe ich ein Elternteil Typ CustomType mit einer virtuellen Methode aufgerufen, die ich umsetzen kann meine benutzerdefinierten Typ zu einem „normalen“ QVariant konvertieren:

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

ich meine benutzerdefinierte Geld Klasse dann von dieser geerbt.

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

Dies ermöglicht es mir, meine benutzerdefinierten Variablen Geld in QVariants enthalten passieren, damit ich sie in dem Qt-Eigenschaft System verwenden kann, Model/View-Framework oder das SQL-Modul.

Aber wenn ich meine benutzerdefinierte Money-Variable in der Datenbank (mit QSqlQuery.addBindValue) speichern muss, kann es keine benutzerdefinierte Klasse sein, es muss ein bekannter Typ (wie double) sein.

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

myNewVariant hat nun die Art von Doppel, nicht Geld, also kann ich sie in einer Datenbank verwenden:

myqsqlquery.addBindValue(myNewVariant); 

oder es in eine Zeichenfolge konvertieren:

QString s = myNewVariant.toString(); 
+4

Ich denke, die void * QVariant :: data() -Methode ist nicht in der Qt-Dokumentation. – darkadept

-1

Was passiert, wenn Sie es auf diese Weise versuchen?

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

Bist du sicher, Sie können eine Methode für einen nativen Datentyp aufrufen? – dirkgently

+0

Nein. double verfügt über keine .toString() -Methode. Das würde nicht funktionieren. – darkadept

+0

Ersetzen Sie einfach die Rückgabe _value.toString(); bei Rückgabe QVariant :: Nummer (_value); – Doodloo

0

Sind Sie folgende Arbeiten sicher?

Rückgabe QString (_value);

Ich scheine keine QString Ctor zu finden, die eine double nimmt. Sie müssen die Konvertierung hier selbst vornehmen. Der Qt Weg ist zu:

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

Sie haben Recht, es gibt keinen Ctor, der ein Double braucht. Ich hätte diese Zeile als "return QString :: number (_value)" schreiben sollen. – darkadept

+0

Entweder sollte dein Problem behoben werden. – dirkgently

+0

QVariant verbraucht mehr Speicher. QString :: number (_value) ist eine bessere Lösung. –