Pergunta

Eu tenho uma classe personalizada chamada dinheiro que eu tenho declarado com 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);

eu armazenar que em um QVariant e eu quero convertê-lo em um QString:

QVariant v = QVariant::fromValue(m);

QString s = v.toString();

Variável s acaba sendo uma cadeia nula porque QVariant não sabe como converter o meu tipo personalizado para a cadeia. Existe alguma maneira de fazer isso?

Foi útil?

Solução

Ok eu encontrei uma maneira de fazer isso. Eu criei um tipo pai chamado CustomType com um método virtual que pode implementar para converter o meu tipo personalizado a um "normal" QVariant:

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

Eu, então, herdou a minha classe personalizada dinheiro com isso.

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

Isso me permite passar meus variáveis ??Dinheiro personalizados contido no QVariants para que eu possa usá-los no sistema de propriedade Qt, quadro modelo / exibição, ou o módulo de SQL.

Mas se eu preciso para armazenar minha variável dinheiro costume no banco de dados (usando QSqlQuery.addBindValue) não pode ser uma classe personalizada, que tem que ser um tipo conhecido (como duplo).

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

myNewVariant agora tem o tipo de casal, não o dinheiro para que eu possa usá-lo em um banco de dados:

myqsqlquery.addBindValue(myNewVariant); 

ou convertê-lo para uma string:

QString s = myNewVariant.toString();

Outras dicas

Você tem certeza as seguintes obras?

retornar QString (_value);

Eu não parecem encontrar uma ctor QString que leva um double. Você vai ter que fazer a conversão aqui mesmo. A maneira Qt é:

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

O que acontece se você experimentá-lo desta maneira?

class Money {
public:
  Money(double d) {
    _value = d;
  }
  ~Money() {}
  QString toString() const {
    return _value.toString();
  }
private:
  double _value;
};
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top