2010-04-01 4 views
4

J'ai enregistré un type d'énumération "ClefType" dans mon fichier d'en-tête - cette énumération est enregistrée avec le système MetaObject à l'aide des macros Q_DECLARE_METATYPE et Q_ENUMS. qRegisterMetaType est également appelé dans le constructeur de la classe.Accéder à une énumération stockée dans un QVariant

Cela me permet d'utiliser ce type dans un Q_PROPERTY, tout cela fonctionne très bien. Cependant, plus tard, je dois pouvoir obtenir la Q_PROPERTY de ce type enum, étant donné l'objet - sous une forme qui convient à la sérialisation.

Idéalement, il serait utile de stocker la valeur entière pour ce membre enum, parce que je ne veux pas que ce soit spécifique au type de ENUM qui est utilisé - finalement je veux avoir plusieurs énumérations différentes. semblent énumérations personnalisés ne pas être directement « coulable » à une valeur entière -

// This is inside a loop over all the properties on a given object 
QMetaProperty property = metaObject->property(propertyId); 
QString propertyName = propertyMeta.name(); 
QVariant variantValue = propertyMeta.read(serializeObject); 

// If, internally, this QVariant is of type 'ClefType', 
// how do I pull out the integer value for this enum? 

Malheureusement variantValue.toInt(); ne fonctionne pas.

Merci à l'avance,

Henry

Répondre

0

Vous pouvez utiliser les >> et << opérateurs de QVariant à cette fin.

Saving (où MyClass *x = new MyClass(this); et out est un QDataStream):

const QMetaObject *pObj = x->pObj(); 
for(int id = pObj->propertyOffset(); id < pObj->propertyCount(); ++id) 
{ 
    QMetaProperty pMeta = pObj->property(id); 
    if(pMeta.isReadable() && pMeta.isWritable() && pMeta.isValid()) 
    { 
     QVariant variantValue = pMeta.read(x); 
     out << variantValue; 
    } 
} 

Chargement:

const QMetaObject *pObj = x->pObj(); 
for(int id = pObj->propertyOffset(); id < pObj->propertyCount(); ++id) 
{ 
    QMetaProperty pMeta = pObj->property(id); 
    if(pMeta.isReadable() && pMeta.isWritable() && pMeta.isValid()) 
    { 
     QVariant variantValue; 
     in >> variantValue; 
     pMeta.write(x, variantValue); 
    } 
} 

Vous devrez appeler

qRegisterMetaType<CMyClass::ClefType>("ClefType"); 
    qRegisterMetaTypeStreamOperators<int>("ClefType"); 

en plus d'utiliser Q_OBJECT, Q_ENUMS et Q_PROPERTY. L'appel qRegisterMetaTypeStreamOperators<int> indique à Qt d'utiliser les versions int de operator<< et operator>>. En passant: en utilisant qRegisterMetaType<CMyClass::ClefType>() au lieu de la forme qui prend un nom ne fonctionne pas pour moi. Cela peut être le cas si vous avez utilisé l'identifiant retourné pour rechercher le nom, mais c'est beaucoup plus facile.

Pour votre information, voici la définition MyClass:

class CMyClass : public QObject 
{ 
    Q_OBJECT 
    Q_ENUMS(ClefType) 
    Q_PROPERTY(ClefType cleftype READ getCleftype WRITE setCleftype) 
public: 
    CMyClass(QObject *parent) : QObject(parent), m_cleftype(One) 
    { 
     qRegisterMetaType<CMyClass::ClefType>("ClefType"); 
     qRegisterMetaTypeStreamOperators<int>("ClefType"); 
    } 
    enum ClefType { Zero, One, Two, Three }; 
    void setCleftype(ClefType t) { m_cleftype = t; } 
    ClefType getCleftype() const { return m_cleftype; } 
private: 
    ClefType m_cleftype; 
}; 

Q_DECLARE_METATYPE(CMyClass::ClefType) 
+0

Cela fonctionne très bien - merci beaucoup pour votre réponse en profondeur! Très appréciée –

1

Essayez:

int x = variantValue.value<ClefType>(); 
+0

Bien que cela fonctionne spécifiquement pour ClefType, je voudrais idéalement que cela fonctionne pour n'importe quel type énuméré. –

1

J'ai eu ce même problème, et est venu avec la solution ci-dessous, qui fonctionne pour tout type énuméré:

int x = property.enumerator().value(*reinterpret_cast<const int *>(variantValue.constData())); 
Questions connexes