如何通过qt5中的QObject::setProperty(任何特定版本)使用QVariant(从xml文本节点获取值)



最近我想从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中的_openTypeExampleOject的属性,它是一个枚举:

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属性?

目前,我通过两个步骤实现:

  1. 将属性写入xml时,如果属性是带QMetaProperty::isEnumType()的枚举属性,则写入属性type="enum"
  2. 读取属性时,请检查它是否具有属性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;
}
}
}
//...

还有什么好主意吗?这对我很管用。

相关内容

  • 没有找到相关文章

最新更新