2009-03-17 12 views
8

में कनवर्ट करें मेरे पास धन नामक एक कस्टम क्लास है जिसे मैंने Q_DECLARE_METATYPE() के साथ घोषित किया है।एक कस्टम प्रकार के एक QVariant को QString

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 कैसे कन्वर्ट करने के लिए पता नहीं है मेरी स्ट्रिंग के लिए कस्टम प्रकार। क्या इसे करने का कोई तरीका है?

उत्तर

4

ठीक है, मुझे ऐसा करने का एक तरीका मिला। मैं एक आभासी विधि है कि मैं एक "सामान्य" 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 में निहित चर पारित करने के लिए अनुमति देता है।

लेकिन अगर मुझे डेटाबेस में अपना कस्टम मनी वैरिएबल स्टोर करना है (QSqlQuery.addBindValue का उपयोग करके) यह एक कस्टम क्लास नहीं हो सकता है, तो यह एक ज्ञात प्रकार (जैसे डबल) होना चाहिए।

myqsqlquery.addBindValue(myNewVariant); 

या यह एक स्ट्रिंग के लिए कनवर्ट:

QString s = myNewVariant.toString(); 
+4

मुझे लगता है कि शून्य * QVariant :: डेटा() विधि क्यूटी दस्तावेज में नहीं है। – darkadept

-1

यदि आप इसे इस तरह से आजमाते हैं तो क्या होता है?

class Money { 
public: 
    Money(double d) { 
    _value = d; 
    } 
    ~Money() {} 
    QString toString() const { 
    return _value.toString(); 
    } 
private: 
    double _value; 
}; 
+0

तुम्हें यकीन

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

myNewVariant अब, डबल नहीं मनी तो मैं एक डेटाबेस में उपयोग कर सकते हैं के प्रकार है आप मूल डेटाटाइप पर एक विधि कॉल कर सकते हैं? – dirkgently

+0

नहीं। डबल में एक .toString() विधि नहीं है। वह काम नहीं करेगा। – darkadept

+0

बस वापसी _value.toString() को प्रतिस्थापित करें; बदले में QVariant :: संख्या (_value); – Doodloo

0

क्या आप वाकई निम्नलिखित कार्य करते हैं?

वापसी QString (_value);

मुझे QString ctor नहीं लगता है जो double लेता है। आपको यहां स्वयं रूपांतरण करना होगा। क्यूटी तरीका है:

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

आप सही हैं, कोई सीटीओ नहीं है जो एक डबल लेता है। मुझे उस पंक्ति को "वापसी QString :: संख्या (_value) के रूप में लिखा जाना चाहिए था;" – darkadept

+0

या तो अपनी समस्या को ठीक करना चाहिए। – dirkgently

+0

QVariant अधिक स्मृति का उपभोग करता है। क्यूस्ट्रिंग :: संख्या (_value) एक बेहतर समाधान है। –

संबंधित मुद्दे