最近我想从xml文件重建一个对象。一个xml文件看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<Root version="0.0.1" author="lee" modify="2020-10-03">
<ExampleOject>
<_id>10</_id>
<_openType>1</_openType>
</ExampleOject>
</Root>
xml中的_openType
是ExampleOject
的属性,它是一个枚举:
class ExampleOject
{
Q_OBJECT
Q_PROPERTY(OpenType _openType READ getType WRITE setType)
public:
enum OpenType{BY_ID = 1, BY_NAME=2};
Q_ENUM(Status)
OpenType _openType;
OpenType getType() const{return _openType;}
void setType(const OpenType &type){_openType = type;}
};
在我找到属性节点后,我从文件中读取并设置为属性,如:
QString propertyName = xmlReader.name().toString();
QString propertyValue = xmlReader.readElementText();
if(!obj->setProperty(propertyName.toStdString().c_str(), QVariant(propertyValue)))
{
return;
}
但这失败了(QObject::setProperty返回false和(,我环顾四周,得到的一件事是,我们只能用int或uint设置枚举类型,而不能从QString或任何其他类型设置。
有没有办法通过QObject::setProperty
或其他方法设置qt5中对象的enum
属性?
目前,我通过两个步骤实现:
- 将属性写入xml时,如果属性是带
QMetaProperty::isEnumType()
的枚举属性,则写入属性type="enum"
- 读取属性时,请检查它是否具有属性
type="enum"
所以,最后我的xml文件看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<Root version="0.0.1" author="lee" modify="2020-10-03">
<ExampleOject>
<_id>10</_id>
<_openType type="enum">1</_openType>
</ExampleOject>
</Root>
步骤1。相关的书写代码:
//... get _openType node
QMetaProperty metaproperty = staticMetaObject.property(i);
if(metaproperty.isEnumType())
{
// write type = "enum" attribute into that node
}
//...
步骤2。读取:
// ... get _openType node
auto isEnum = xmlReader.attributes().value("type");
if(isEnum.toString() == QString("enum"))
{
QString propertyValue = xmlReader.readElementText();
qint32 enumValue = propertyValue.toInt();
if(!obj->setProperty(propertyName.toStdString().c_str(), QVariant(enumValue)))
{
return;
}
else
{
QString propertyValue = xmlReader.readElementText();
if(!obj->setProperty(propertyName.toStdString().c_str(), QVariant(propertyValue)))
{
return;
}
}
}
//...
还有什么好主意吗?这对我很管用。