2010-04-01 206 views
4

我在头文件中注册了枚举类型“ClefType” - 此枚举使用Q_DECLARE_METATYPE和Q_ENUMS宏在MetaObject系统中注册。 qRegisterMetaType也在类构造函数中调用。访问存储在QVariant中的枚举

这使我可以在Q_PROPERTY中使用这种类型,这一切都很好。然而,稍后,我需要能够获得这个枚举类型的Q_PROPERTY,给定对象 - 以适合序列化的形式。

理想情况下,为该枚举成员存储整数值将是有用的,因为我不希望这是特定于使用的枚举类型 - 最终我想要有几个不同的枚举

// 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? 

不幸的是variantValue.toInt();不起作用 - 自定义枚举似乎没有直接“浇注料”为整数值。

由于提前,

亨利

回答

0

您可以使用>><<运营商的QVariant的做到这一点。

储蓄(其中MyClass *x = new MyClass(this);outQDataStream):

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; 
    } 
} 

加载:

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); 
    } 
} 

您需要调用

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

除了使用Q_OBJECTQ_ENUMSQ_PROPERTY。调用qRegisterMetaTypeStreamOperators<int>告诉Qt使用int版本的operator<<operator>>

顺便说一下:使用qRegisterMetaType<CMyClass::ClefType>()而不是名称形式不适用于我。如果您使用返回的ID来查找名称,可能会更容易。

仅供参考,这里是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

效果很好 - 非常感谢您的深入响应!非常感激 – 2010-04-07 10:06:53

1

尝试:

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

虽然这会工作特别是对于ClefType,理想情况下我喜欢这种方式适用于任何枚举类型。 – 2010-04-01 19:50:08

1

我有同样的问题,并与下面的解决方案,它适用于任何枚举类型上来:

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