تحويل QVariant من النوع المخصص إلى QString
سؤال
لدي فئة مخصصة يسمى المال الذي كنت قد أعلنت مع 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;
};