質問
Q_DECLARE_METATYPE()で宣言したMoneyというカスタムクラスがあります。
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();
QVariantはカスタムタイプを文字列に変換する方法を知らないため、変数 s は最終的にnull文字列になります。これを行う方法はありますか?
解決
わかりました、これを行う方法を見つけました。 カスタムタイプを<!> quot; normal <!> quot;に変換するために実装できる仮想メソッドを使用して、CustomTypeという親タイプを作成しました。 QVariant:
class CustomType {
public:
virtual ~CustomType() {}
virtual QVariant toVariant() const { return QVariant(); }
};
次に、これからカスタムMoneyクラスを継承しました。
class Money : public CustomType {
public:
Money(double d) {
_value = d;
}
~Money() {}
QVariant toVariant() {
return QVariant(_value);
}
private:
double _value;
};
これにより、QVariantsに含まれるカスタムMoney変数を渡すことができるため、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 のタイプがMoneyではなくdoubleになったため、データベースで使用できます:
myqsqlquery.addBindValue(myNewVariant);
または文字列に変換します:
QString s = myNewVariant.toString();
他のヒント
以下が機能することを確認しますか?
return QString(_value);
QString
をとるdouble
ctorが見つからないようです。ここで変換を行う必要があります。 Qtの方法は次のとおりです。
QString toString() const {
QVariant d(_value);
return d.ToQString();
}
この方法で試してみるとどうなりますか?
class Money {
public:
Money(double d) {
_value = d;
}
~Money() {}
QString toString() const {
return _value.toString();
}
private:
double _value;
};
所属していません StackOverflow