Преобразование QVariant пользовательского типа в QString

у меня есть пользовательский класс 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 ответов


Ок я нашел один способ сделать это. Я создал родительский тип 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, чтобы я мог использовать их в системе свойств Qt, структуре модели/представления или модуле sql.

но если мне нужно хранить мои пользовательские деньги переменная в базе данных (с помощью QSqlQuery.addBindValue) это не может быть пользовательский класс, он должен быть известным типом (например, double).

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

myNewVariant теперь имеет тип double, а не деньги, поэтому я могу использовать его в базе данных:

myqsqlquery.addBindValue(myNewVariant); 

или преобразовать его в строку:

QString s = myNewVariant.toString();

вы уверены, что следующие работы?

вернуться в QString(пределах _value);

Я, кажется, не найти QString ctor, который принимает 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;
};