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

发布于 2024-07-15 09:16:09 字数 519 浏览 3 评论 0原文

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

I have a custom class called Money that I have declared with 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);

I store that in a QVariant and I want to convert it to a QString:

QVariant v = QVariant::fromValue(m);

QString s = v.toString();

Variable s ends up being a null string because QVariant doesn't know how to convert my custom type to the string. Is there any way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

酒儿 2024-07-22 09:16:09

好吧,我找到了一种方法来做到这一点。
我创建了一个名为 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();

Ok I found one way to do this.
I created a parent type called CustomType with a virtual method that I can implement to convert my custom type to a "normal" QVariant:

class CustomType {
public:
  virtual ~CustomType() {}
  virtual QVariant toVariant() const { return QVariant(); }
};

I then inherited my custom Money class from this.

class Money : public CustomType {
public:
  Money(double d) {
    _value = d;
  }
  ~Money() {}
  QVariant toVariant() {
    return QVariant(_value);
  }
private:
  double _value;
};

This allows me to pass my custom Money variables contained in QVariants so I can use them in the Qt property system, model/view framework, or the sql module.

But if i need to store my custom Money variable in the database (using QSqlQuery.addBindValue) it can't be a custom class, it has to be a known type (like double).

QVariant myMoneyVariant = myqobject.property("myMoneyProperty");
void *myData = myMoneyVariant.data();
CustomType *custType = static_cast<CustomType*>(myData);
QVariant myNewVariant = ct->toVariant();

myNewVariant now has the type of double, not Money so I can use it in a database:

myqsqlquery.addBindValue(myNewVariant); 

or convert it to a string:

QString s = myNewVariant.toString();
ˉ厌 2024-07-22 09:16:09

您确定以下内容有效吗?

返回QString(_value);

我似乎没有找到需要 doubleQString ctor。 您必须自己在此处进行转换。 Qt 的方法是:

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

Are you sure the following works?

return QString(_value);

I don't seem to find a QString ctor that takes a double. You will have to do the conversion here yourself. The Qt way is to:

QString toString() const {
 QVariant d(_value);
 return d.ToQString();
}
爱的十字路口 2024-07-22 09:16:09

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

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

What happens if you try it this way?

class Money {
public:
  Money(double d) {
    _value = d;
  }
  ~Money() {}
  QString toString() const {
    return _value.toString();
  }
private:
  double _value;
};
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文