我有称为钱的自定义类,我已用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();

变量的取值最后成了一个空字符串,因为的QVariant不知道如何我的自定义类型转换为字符串。有没有办法做到这一点?

有帮助吗?

解决方案

好吧,我发现做到这一点的方法之一。 我创建称为CustomType一个父类型与我可以实现到我的自定义类型转换为一个“正常”的QVariant一个虚拟方法:

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

这让我通过包含在QVariants我的自定义货币变量,所以我可以在Qt的产权制度,模型/视图框架,或SQL模块中使用它们。

但是,如果我需要我的自定义货币变量存储在(使用QSqlQuery.addBindValue)数据库它不能自定义类,它必须是一个已知类型(如双)。

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

其他提示

您确定了以下工作?

  

返回的QString(_value);

我似乎没有找到一个QString构造函数,需要一个double。你必须在这里做转换自己。 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