Domanda

Ho una classe personalizzata chiamata Money che ho dichiarato con 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);

Lo memorizzo in un QVariant e voglio convertirlo in un QString:

QVariant v = QVariant::fromValue(m);

QString s = v.toString();

La variabile s finisce per essere una stringa nulla perché QVariant non sa come convertire il mio tipo personalizzato nella stringa. C'è un modo per farlo?

È stato utile?

Soluzione

Ok ho trovato un modo per farlo. Ho creato un tipo genitore chiamato CustomType con un metodo virtuale che posso implementare per convertire il mio tipo personalizzato in un "normale" QVariant:

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

Ho quindi ereditato la mia classe Money personalizzata da questo.

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

Questo mi permette di passare le mie variabili Money personalizzate contenute in QVariants in modo da poterle usare nel sistema di proprietà Qt, nel framework modello / vista o nel modulo sql.

Ma se devo archiviare la mia variabile Money personalizzata nel database (usando QSqlQuery.addBindValue) non può essere una classe personalizzata, deve essere un tipo noto (come double).

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

myNewVariant ora ha il tipo di double, non Money, quindi posso usarlo in un database:

myqsqlquery.addBindValue(myNewVariant); 

o convertilo in una stringa:

QString s = myNewVariant.toString();

Altri suggerimenti

Sei sicuro che le seguenti funzioni?

  

return QString (_value);

Non mi sembra di trovare un ctor QString che accetta un doppio . Dovrai fare la conversione qui da solo. Il modo Qt è:

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

Cosa succede se lo provi in ??questo modo?

class Money {
public:
  Money(double d) {
    _value = d;
  }
  ~Money() {}
  QString toString() const {
    return _value.toString();
  }
private:
  double _value;
};
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top