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

StackOverflow https://stackoverflow.com/questions/654953

  •  19-08-2019
  •  | 
  •  

Вопрос

У меня есть собственный класс с именем 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 не знает, как преобразовать мой пользовательский тип в строку. Есть ли способ сделать это?

Это было полезно?

Решение

Хорошо, я нашел один способ сделать это. Я создал родительский тип с именем CustomType с помощью виртуального метода, который я могу реализовать для преобразования моего пользовательского типа в & Quot; normal & Quot; 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;
};

Это позволяет мне передавать мои собственные переменные Money, содержащиеся в QVariants, чтобы я мог использовать их в системе свойств 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();

Другие советы

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

  

return 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;
};
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top