C++ 从QT中的Q_属性序列化嵌套的用户定义类
面临以下问题:我无法从Q_属性序列化用户定义的对象 我尝试将RegisterSettings类序列化为QDataStream。其思想是能够将其序列化为文本文件(使用>操作符)。它应该验证从文件读取的字段是否仍然有效。所以我检查了这家酒店。 问题在于Q_属性(QList groups成员组)未按预期工作。 看起来创建这样的功能是可能的,但看起来并不那么容易。 有人能帮助我们从Q_属性序列化用户定义的类吗 代码被简化为更具可读性,但主要思想已经到位C++ 从QT中的Q_属性序列化嵌套的用户定义类,c++,qt,serialization,qmetaobject,C++,Qt,Serialization,Qmetaobject,面临以下问题:我无法从Q_属性序列化用户定义的对象 我尝试将RegisterSettings类序列化为QDataStream。其思想是能够将其序列化为文本文件(使用>操作符)。它应该验证从文件读取的字段是否仍然有效。所以我检查了这家酒店。 问题在于Q_属性(QList groups成员组)未按预期工作。 看起来创建这样的功能是可能的,但看起来并不那么容易。 有人能帮助我们从Q_属性序列化用户定义的类吗 代码被简化为更具可读性,但主要思想已经到位 class RegisterGroupSettin
class RegisterGroupSettings:SettingsItem<RegisterGroupSettings>
{
private:
Q_GADGET
Q_PROPERTY(QString name MEMBER name)
Q_PROPERTY(int interval MEMBER interval)
public:
QString name;
int interval;
};
Q_DECLARE_METATYPE(RegisterGroupSettings)
class RegistersSettings:SettingsItem<RegistersSettings>
{
private:
Q_GADGET
Q_PROPERTY(QList<RegisterGroupSettings> groups MEMBER groups)
Q_PROPERTY(int code MEMBER code)
public:
QList<RegisterGroupSettings> groups;
int code;
};
Q_DECLARE_METATYPE(RegistersSettings)
类注册表组设置:设置站点
{
私人:
Q_小工具
Q_属性(QString名称成员名称)
Q_属性(int区间成员区间)
公众:
QString名称;
整数区间;
};
Q_DECLARE_元类型(RegisterGroupSettings)
类注册表设置:设置站点
{
私人:
Q_小工具
Q_属性(QList组成员组)
Q_属性(整数代码成员代码)
公众:
QList组;
int代码;
};
Q_DECLARE_元类型(寄存器设置)
SettingsItem是统一的助手
template <typename T> class SettingsItem
{
public:
friend QDataStream & operator << (QDataStream &arch, const T & object)
{
const QMetaObject &mo = object.staticMetaObject;
int cnt = mo.propertyCount();
QString prop_name;
QVariant prop_value;
arch << cnt;
while (cnt>0)
{
prop_name = mo.property(cnt-1).name();
prop_value = mo.property(cnt-1).readOnGadget(&object);
arch << prop_name;
arch << prop_value;
cnt--;
}
return arch;
}
friend QDataStream & operator >> (QDataStream &arch, T & object)
{
const QMetaObject &mo = object.staticMetaObject;
int cnt=0;
QString prop_name;
QVariant prop_value;
int prop_index;
arch >> cnt;
while (cnt>0)
{
arch >> prop_name;
arch >> prop_value;
prop_index = mo.indexOfProperty(prop_name.toStdString().c_str());
if (prop_index > -1)
{
mo.property(prop_index).writeOnGadget(&object, prop_value);
}
cnt--;
}
return arch;
}
friend bool operator == (const T &first, const T &second)
{
const QMetaObject &mo = first.staticMetaObject;
int cnt = mo.propertyCount();
QString prop_name;
QVariant oProp_value;
QVariant dProp_value;
while (cnt>0)
{
prop_name = mo.property(cnt-1).name();
oProp_value = mo.property(cnt-1).readOnGadget(&first);
dProp_value = mo.property(cnt-1).readOnGadget(&second);
if (oProp_value == dProp_value)
{
cnt--;
continue;
}
return false;
}
return true;
}
friend bool operator != (const T &first, const T &second)
{
return !( first == second );
}
};
模板类设置sitem
{
公众:
friend QDataStream&operator>cnt;
而(cnt>0)
{
拱门>>道具名称;
拱>>属性值;
prop_index=mo.indexOfProperty(prop_name.toStdString().c_str());
如果(项目索引>-1)
{
属性(属性索引).writeOnGadget(&object,属性值);
}
碳纳米管;
}
返回拱;
}
友元布尔运算符==(常数T和第一个、常数T和第二个)
{
常量QMetaObject&mo=first.staticMetaObject;
int cnt=mo.propertyCount();
QString属性名称;
q变量oProp_值;
qdprop_值;
而(cnt>0)
{
prop_name=mo.property(cnt-1).name();
oProp_value=mo.property(cnt-1).readOnGadget(&first);
dProp_value=mo.property(cnt-1).readOnGadget(&second);
if(oProp_值==dProp_值)
{
碳纳米管;
继续;
}
返回false;
}
返回true;
}
朋友布尔接线员!=(常数T和第一、常数T和第二)
{
返回!(第一个==第二个);
}
};
解决方案是使用构造函数扩展模板
SettingsItem()
{
qRegisterMetaType<T>();
qRegisterMetaTypeStreamOperators<T>(T::staticMetaObject.className());
}
RegistersSettings()
{
qRegisterMetaTypeStreamOperators<QList<RegisterGroupSettings>>("QList<RegisterGroupSettings>");
}
SettingsItem()
{
qRegisterMetaType();
qRegisterMetaTypeStreamOperators(T::staticMetaObject.className());
}
并在类构造函数中注册嵌套类型
SettingsItem()
{
qRegisterMetaType<T>();
qRegisterMetaTypeStreamOperators<T>(T::staticMetaObject.className());
}
RegistersSettings()
{
qRegisterMetaTypeStreamOperators<QList<RegisterGroupSettings>>("QList<RegisterGroupSettings>");
}
RegistersSettings()
{
qRegisterMetaTypeStreamOperators(“QList”);
}