2009-03-17 3 views
8

У меня есть пользовательский класс «Деньги», который я объявил с помощью Q_DECLARE_METATYPE().Преобразование QVariant настраиваемого типа в 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); 

хранить, что в QVariant, и я хочу, чтобы преобразовать его в QString:

QVariant v = QVariant::fromValue(m); 

QString s = v.toString(); 

Variable ов заканчивает тем, что пустую строку, поскольку QVariant не знает, как конвертировать мой настраиваемый тип для строки. Есть какой-либо способ сделать это?

ответ

4

Хорошо, я нашел один из способов сделать это. Я создал родительский тип, который называется CustomType с виртуальным способом, который я могу осуществить, чтобы преобразовать свой собственный тип к «нормальному» QVariant:

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

Затем я унаследовал мой пользовательский класс Денег от этого.

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

Это позволяет мне передать мои пользовательские переменные Деньги, содержащиеся в QVariants, так что я могу использовать их в системе Qt собственности, модель/представление структуры или модуля SQL.

Но если мне нужно сохранить свою пользовательскую переменную Money в базе данных (используя QSqlQuery.addBindValue), она не может быть обычным классом, она должна быть известным типом (например, double).

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

myNewVariant теперь имеет вид двойной, а не деньги, так что я могу использовать его в базе данных:

myqsqlquery.addBindValue(myNewVariant); 

или преобразовать его в строку:

QString s = myNewVariant.toString(); 
+4

Я думаю, что метод void * QVariant :: data() не содержится в документации Qt. – darkadept

-1

Что произойдет, если вы попробуете это так?

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

Вы уверены, вы можете вызвать метод по собственному типу данных? – dirkgently

+0

Nope. double не имеет метода .toString(). Это не сработает. – darkadept

+0

Просто замените return _value.toString(); по возврату QVariant :: number (_value); – Doodloo

0

Вы уверены, что следующие работы?

возвращение QString (_value);

Кажется, я не нашел QString ctor, который принимает double. Вам придется сделать здесь конверсию самостоятельно. Способ Qt заключается в следующем:

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

Вы правы, нет ctor, который принимает двойной. Я должен был написать эту строку как «return QString :: number (_value)»; – darkadept

+0

Либо вы должны исправить свою проблему. – dirkgently

+0

QVariant потребляет больше памяти. QString :: number (_value) - лучшее решение. –

Смежные вопросы