gpt4 book ai didi

qt4 - 访问存储在 QVariant 中的枚举

转载 作者:行者123 更新时间:2023-12-02 10:35:02 37 4
gpt4 key购买 nike

我已经在头文件中注册了一个枚举类型“ClefType” - 该枚举是使用 Q_DECLARE_METATYPE 和 Q_ENUMS 宏在 MetaObject 系统中注册的。 qRegisterMetaType 也在类构造函数中调用。

这允许我在 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(); 不起作用 - 自定义枚举似乎不能直接“转换”为整数值。

提前致谢,

亨利

最佳答案

您可以使用>><< 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_OBJECT , Q_ENUMSQ_PROPERTY 。调用qRegisterMetaTypeStreamOperators<int>告诉 Qt 使用 operator<< 的 int 版本和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)

关于qt4 - 访问存储在 QVariant 中的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2560242/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com