문제

q_declare_metatype ()로 선언 한 Money라는 사용자 정의 클래스가 있습니다.

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

변하기 쉬운 에스 QVariant가 내 사용자 지정 유형을 문자열로 변환하는 방법을 모르기 때문에 널 문자열이됩니다. 이것을 할 방법이 있습니까?

도움이 되었습니까?

해결책

좋아, 나는 이것을하는 한 가지 방법을 찾았다. 사용자 정의 유형을 "일반"QVariant로 변환하기 위해 구현할 수있는 가상 메소드가있는 CustomType라는 부모 유형을 만들었습니다.

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

그런 다음 이것으로부터 내 커스텀 머니 클래스를 물려 받았습니다.

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

이를 통해 QVariants에 포함 된 사용자 정의 머니 변수를 전달하여 QT 속성 시스템, 모델/보기 프레임 워크 또는 SQL 모듈에서 사용할 수 있습니다.

그러나 데이터베이스에 사용자 정의 머니 변수를 저장 해야하는 경우 (qsqlquery.addbindvalue 사용) 사용자 정의 클래스가 될 수 없으므로 알려진 유형 (예 : 더블)이어야합니다.

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

MyNewvariant 이제 돈이 아닌 이중 유형이 있으므로 데이터베이스에서 사용할 수 있습니다.

myqsqlquery.addBindValue(myNewVariant); 

또는 문자열로 변환합니다.

QString s = myNewVariant.toString();

다른 팁

다음 작품이 확실합니까?

반환 QSTRING (_Value);

나는 찾지 않는 것 같다 QString a 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