8

我有一个名为 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 不知道如何将我的自定义类型转换为字符串。有没有办法做到这一点?

4

3 回答 3

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();
于 2009-03-17T18:10:57.307 回答
0

您确定以下工作吗?

返回 QString(_value);

我似乎没有找到一个QString接受double. 您必须自己在这里进行转换。Qt的方法是:

QString toString() const {
 QVariant d(_value);
 return d.ToQString();
}
于 2009-03-17T16:39:06.060 回答
-1

如果你这样尝试会发生什么?

class Money {
public:
  Money(double d) {
    _value = d;
  }
  ~Money() {}
  QString toString() const {
    return _value.toString();
  }
private:
  double _value;
};
于 2009-03-17T16:37:52.443 回答