2009-03-17 7 views
8

にカスタムタイプのQVariantを変換します。は)私はQ_DECLARE_METATYPE(と宣言しているマネーと呼ばれるカスタムクラスを持っている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は私を変換する方法を知らないので、

QVariant v = QVariant::fromValue(m); 

QString s = v.toString(); 

変数はヌル文字列なってしまいますカスタムタイプを文字列に追加します。これを行う方法はありますか?

答えて

4

私はこれを行う方法を見つけました。 私が「正常な」QVariantに私のカスタム型を変換するために実装できる仮想メソッドでCustomTypeと呼ばれる親の型を作成:私はこれからの私のカスタムマネークラスを継承し

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

これは、私はQtのプロパティシステム、モデル/ビューフレームワーク、またはSQLモジュールでそれらを使用できるように、私はQVariantsに含まれている私のカスタムマネー変数を渡すことができます。

QSqlQuery.addBindValueを使用してカスタムのMoney変数をデータベースに保存する必要がある場合は、カスタムクラスにすることはできません。既知の型(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

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)はより良い解決策です。 –

関連する問題