سؤال

لدي فئة مخصصة يسمى المال الذي كنت قد أعلنت مع 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 لا تعرف كيفية تحويل مخصص نوع string.هل هناك أي طريقة للقيام بذلك ؟

هل كانت مفيدة؟

المحلول

حسنا لقد وجدت طريقة واحدة للقيام بذلك.أنا خلقت الوالدين نوع يسمى CustomType الظاهري الطريقة التي لا يمكن أن تنفذ إلى تحويل مخصص النوع "العادي" QVariant:

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 المنشئ أن يأخذ 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