将自定义类型的QVariant转换为QString

时间:2009-03-17 16:20:08

标签: qt4 qvariant

我有一个名为Money的自定义类,我已使用Q_DECLARE_METATYPE()声明。

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();

变量 s 最终成为空字符串,因为QVariant不知道如何将自定义类型转换为字符串。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:4)

好的,我发现了一种方法。 我使用虚拟方法创建了一个名为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 现在的类型为double,而不是Money,所以我可以在数据库中使用它:

myqsqlquery.addBindValue(myNewVariant); 

或将其转换为字符串:

QString s = myNewVariant.toString();

答案 1 :(得分:0)

您确定以下内容有效吗?

  

返回QString(_value);

我似乎找不到QString ctor,它需要double。您必须自己进行转换。 Qt方式是:

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

答案 2 :(得分:-1)

如果以这种方式尝试会发生什么?

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