質問

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;
};
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top