Konvertieren eines QVariant eines benutzerdefinierten Typs zu einem QString

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

  •  19-08-2019
  •  | 
  •  

Frage

Ich habe eine benutzerdefinierte Klasse namens Geld, das ich mit Q_DECLARE_METATYPE erklärt haben ().

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

Ich speichere, dass in einem QVariant und ich es zu einem QString konvertieren möchten:

QVariant v = QVariant::fromValue(m);

QString s = v.toString();

Variable s endet als eine leere Zeichenfolge, weil QVariant weiß nicht, wie mein benutzerdefinierten Typen auf die Zeichenfolge zu konvertieren. Gibt es eine Möglichkeit, dies zu tun?

War es hilfreich?

Lösung

Ok fand ich einen Weg, dies zu tun. Ich habe eine Art Mutter genannt CustomType mit einer virtuellen Methode, die ich umsetzen kann meinen benutzerdefinierten Typen zu einem „normalen“ QVariant konvertieren:

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

Ich erbte dann meine benutzerdefinierte Geld Klasse von diesem.

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

Dies ermöglicht es mir, meine benutzerdefinierten Variablen Geld in QVariants enthalten passieren, damit ich sie in dem Qt-Eigenschaftensystem, Model / View-Framework oder das SQL-Modul verwenden kann.

Aber wenn ich brauche meine benutzerdefinierte Geld Variable in der Datenbank zu speichern (mit QSqlQuery.addBindValue) kann es nicht eine benutzerdefinierte Klasse sein, es hat eine bekannte Art (wie double) sein.

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

myNewVariant hat nun die Art der Doppel, nicht Geld, also kann ich sie in einer Datenbank verwenden:

myqsqlquery.addBindValue(myNewVariant); 

oder wandeln sie in einen String:

QString s = myNewVariant.toString();

Andere Tipps

Sind Sie sicher, dass die folgenden Werke?

  

Rückkehr QString (_value);

Ich scheine keine QString Ctor zu finden, die eine double nimmt. Sie werden sich die Umwandlung hier zu tun haben. Der Qt Weg ist:

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

Was passiert, wenn man es auf diese Weise versuchen?

class Money {
public:
  Money(double d) {
    _value = d;
  }
  ~Money() {}
  QString toString() const {
    return _value.toString();
  }
private:
  double _value;
};
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top