[英]Serialize nested user defined class from Q_PROPERTY in QT
面臨以下問題:我無法從 Q_PROPERTY 序列化用戶定義的對象 我嘗試將 RegistersSettings 類序列化為 QDataStream。 這個想法是能夠將其序列化為文本文件(使用 << 運算符),然后能夠讀取它(使用 >> 運算符)。 它應該驗證從文件中讀取的字段是否仍然有效。 所以我檢查財產。 問題是 Q_PROPERTY(QList groups MEMBER groups) 沒有按預期工作。 看起來可以創建這樣的功能,但看起來並不那么容易。 任何人都可以幫助使用如何從 Q_PROPERTY 序列化用戶定義的類的常用方法嗎?
代碼被簡化為更具可讀性,但主要思想已經到位。
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)
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 );
}
};
解決方案是使用構造函數擴展模板
SettingsItem()
{
qRegisterMetaType<T>();
qRegisterMetaTypeStreamOperators<T>(T::staticMetaObject.className());
}
並在類構造函數中注冊嵌套類型
RegistersSettings()
{
qRegisterMetaTypeStreamOperators<QList<RegisterGroupSettings>>("QList<RegisterGroupSettings>");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.