2009-03-17 12 views
8

Mam niestandardową klasę o nazwie Money, którą zadeklarowałem za pomocą Q_DECLARE_METATYPE().Konwersja QVariant niestandardowego typu na 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); 

przechowywać że w QVariant i chcę, aby przekonwertować go na QString:

QVariant v = QVariant::fromValue(m); 

QString s = v.toString(); 

Zmienna ów kończy się ciąg null ponieważ QVariant nie wie jak przerobić mój niestandardowy typ do ciągu. Czy jest jakiś sposób to zrobić?

Odpowiedz

4

Ok Znalazłem jeden sposób, aby to zrobić. I stworzył typ nadrzędny o nazwie CustomType z metodą wirtualną, które można wdrożyć w celu przekształcenia mojego niestandardowy typ do „normalnego” QVariant:

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

Potem odziedziczył mój niestandardową klasę pieniądze z tego.

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

To pozwala mi przekazać moje własne pieniądze zmiennych zawartych w QVariants więc mogę ich używać w systemie Qt nieruchomości, model/view ram lub modułu SQL.

Ale jeśli chcę przechowywać moją niestandardową zmienną Money w bazie danych (przy użyciu QSqlQuery.addBindValue) nie może to być klasa niestandardowa, musi być znanym typem (jak podwójne).

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

myNewVariant ma teraz typu double, nie pieniądze, dzięki czemu można go używać w bazie danych:

myqsqlquery.addBindValue(myNewVariant); 

lub przekonwertować go na ciąg:

QString s = myNewVariant.toString(); 
+4

Myślę, że metoda void * QVariant :: data() nie znajduje się w dokumentacji Qt. – darkadept

-1

Co się stanie, jeśli spróbujesz w ten sposób?

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

Na pewno możesz wywołać metodę na natywnym typie danych? – dirkgently

+0

Nie. double nie ma metody .toString(). To by nie działało. – darkadept

+0

Wystarczy zastąpić return _value.toString(); przez return QVariant :: number (_value); – Doodloo

0

Czy jesteś pewien, że następujące prace?

return QString (_value);

Nie wydaje mi się, żebym znalazł QString ctor, który pobiera double. Konieczne będzie dokonanie konwersji tutaj samodzielnie. Sposób Qt to:

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

Masz rację, nie ma żadnego ctor, który bierze podwójne. Powinienem napisać tę linię jako "return QString :: number (_value);" – darkadept

+0

Należy naprawić problem. – dirkgently

+0

QVariant zużywa więcej pamięci. QString :: number (_value) jest lepszym rozwiązaniem. –

Powiązane problemy