2010-07-07 12 views
6

मैं परीक्षण कोड लिख रहा हूं जो स्वचालित रूप से सभी Q_PROPERTY के विगेट्स के माध्यम से पुन: सक्रिय हो जाएगा और कुछ गुण qRegisterMetaType के माध्यम से पंजीकृत प्रकारों का उपयोग कर रहे हैं। अगर मैं इसे QVariant में पढ़ना/लिखना चाहता हूं तो मुझे वेरिएंट :: उपयोगकर्ता टाइप टाइप करने की आवश्यकता है जब उन्हें संस्करण में संग्रहीत किया जाए। अब तक सब ठीक है।QVariant प्रकार QVariant को सत्यापित कैसे करें :: UserType अपेक्षित प्रकार है?

लेकिन जब मैं इन गुणों के पढ़ने और लिखने का परीक्षण करना चाहता हूं, तो मुझे उनके प्रकार को भी जानने की आवश्यकता है। उन सामानों के लिए जो पहले से ही मानक क्यूटी प्रकार हैं, मैं इसे QVariant :: प्रकार() के माध्यम से कर सकता हूं लेकिन जैसा कि मेरे पास बहुत से उपयोगकर्ता हैं, यह कैसे पूरा किया जाएगा?

QVariant की एपीआई से, मैं इस देखा:

bool QVariant::canConvert (Type t) const

लेकिन मैं थोड़ा संदिग्ध हूँ कि अगर यह enums के मामले में गलत प्रकार के लिए नेतृत्व करेंगे?

तो, QVariant में किस प्रकार का यूज़रटाइप संग्रहीत किया जाता है, यह सत्यापित करने का मूर्ख तरीका क्या होगा?

उत्तर

11

उपयोगकर्ता परिभाषित प्रकारों के लिए QVariant::userType() है। यह QVariant :: प्रकार() की तरह काम करता है लेकिन उपयोगकर्ता परिभाषित प्रकार के प्रकार आईडी पूर्णांक देता है जबकि QVariant :: type() हमेशा QVariant :: UserType लौटाता है।

QVariant::typeName() भी है जो स्ट्रिंग के रूप में प्रकार का नाम देता है।

संपादित करें:

यह शायद तुम कैसे QVariant सेट पर निर्भर करता है। सीधे QVariant::QVariant(int type, const void * copy) का उपयोग कर निराश किया गया है।

मैं इस तरह तीन प्रकार के कहते हैं:

class MyFirstType 
{ 
    public: 
     MyFirstType(); 
     MyFirstType(const MyFirstType &other); 
     ~MyFirstType(); 

     MyFirstType(const QString &content); 

     QString content() const; 

    private: 
     QString m_content; 
}; 
Q_DECLARE_METATYPE(MyFirstType); 

Q_DECLARE_METATYPE बिना तृतीय

मैं उन्हें QVariant में स्टोर:

QString content = "Test"; 

MyFirstType first(content); 

MySecondType second(content); 

MyThirdType third(content); 

QVariant firstVariant; 
firstVariant.setValue(first); 

QVariant secondVariant = QVariant::fromValue(second); 

int myType = qRegisterMetaType<MyThirdType>("MyThirdType"); 

QVariant thirdVariant(myType, &third); // Here the type isn't checked against the data passed 

qDebug() << "typeName for first :" << firstVariant.typeName(); 
qDebug() << "UserType :" << firstVariant.userType(); 
qDebug() << "Type : " << firstVariant.type(); 

[...] 

मैं:

typeName for first : MyFirstType 
UserType : 256 
Type : QVariant::UserType 

typeName for second : MySecondType 
UserType : 257 
Type : QVariant::UserType 

typeName for third : MyThirdType 
UserType : 258 
Type : QVariant::UserType 
+0

हालांकि ऐसा लगता है कि QVarian के मामले में टी :: UserType संस्करण, typeName() विधि "UserType" और typeName() देता है QVariant :: UserType enum value देता है। तो दोनों बेकार हैं – rasjani

+0

ऑब्जेक्ट टाइम्स ठीक हैं, मैं टाइपकास्टिंग के साथ चेक भी कर सकता हूं ताकि आपका उदाहरण भी ठीक से काम करता है। लेकिन मेरा सवाल एनम के बारे में था जो कक्षा प्रकार नहीं है और कोई भी किसी भी संख्यात्मक चर को एक enum में टाइपकास्ट कर सकता है। लेकिन जैसा कहा। मैं आपका कोड जांचूंगा। – rasjani

+0

आह, क्षमा करें, मैंने उस हिस्से को नहीं देखा। मैंने कोशिश की और ऐसा लगता है कि एक enum प्रकार को Q_DECLARE_METATYPE या qRegisterMetaType के साथ पंजीकृत करना संभव है और इसे उसी तरह उपयोग करें। दस्तावेज़ केवल सार्वजनिक डिफ़ॉल्ट कन्स्ट्रक्टर के साथ कक्षा या संरचना के बारे में बात करते हैं, प्रतिलिपि बनाने वाले और विनाशक की प्रतिलिपि बनाते हैं, इसलिए मुझे पूरी तरह से यकीन नहीं है, लेकिन मुझे लगता है कि इसे किसी भी प्रकार के लिए काम करना चाहिए जिसमें सृजन, प्रतिलिपि और विनाश के लिए एक ही अंतर्निहित इंटरफेस है। – Leiaz

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