C++ 控件反序列化上的Qt重写类属性

C++ 控件反序列化上的Qt重写类属性,c++,qt,class,properties,deserialization,C++,Qt,Class,Properties,Deserialization,我正在尝试进行一个简单的控件序列化/反序列化,我得到了以下代码(.cpp) 所以我的问题是,有没有一种方法可以进行适当的转换,或者我应该将QPushButton子类化并公开这些属性?如何在子类中重写这些属性?尝试保存所有属性是没有意义的 具有许多标志,可以帮助您筛选应保存的属性(应避免使用非“存储”和非“可写”属性) 另见 例如,属性x、y和width、height是不可写的,但分别是pos和size属性的一部分,这些属性是可写的,但不可存储的,因为它们本身是较大属性几何体的一部分,这是您真正需

我正在尝试进行一个简单的控件序列化/反序列化,我得到了以下代码(.cpp)


所以我的问题是,有没有一种方法可以进行适当的转换,或者我应该将QPushButton子类化并公开这些属性?如何在子类中重写这些属性?

尝试保存所有属性是没有意义的

具有许多标志,可以帮助您筛选应保存的属性(应避免使用非“存储”和非“可写”属性)

另见


例如,属性
x
y
width
height
是不可写的,但分别是
pos
size
属性的一部分,这些属性是可写的,但不可存储的,因为它们本身是较大属性
几何体的一部分,这是您真正需要保存和恢复的唯一属性,您可以检查此属性是否已存储
可写

,但例如,如果需要保存坐标:x、y和宽度、高度?因为我需要知道位置等,所以我需要恢复it@SirLanceloaaat我编辑了答案来解释为什么
存储的
可写的
属性应该足够了。
#include "serializer.h"
#include "QMetaProperty"
#include "QTextStream"
#include "QDebug"

Serializer::Serializer(QObject *parent) :
    QObject(parent)
{
}

bool Serializer::Serialize(QObject *object,QString name) {
 QDomDocument doc;
 QDomElement root = doc.createElement(object->metaObject()->className());
 doc.appendChild(root);

 for(int i = 0; i < object->metaObject()->propertyCount(); i++)
 {
  QMetaProperty prop = object->metaObject()->property(i);
  QString propName = prop.name();
  if(propName == "objectName")
   continue;
  QDomElement el = doc.createElement(propName);
  QVariant value = object->property(propName.toLatin1().data());
  QDomText txt;
  if (object->metaObject()->property(i).typeName() != "QByteArray") {
   txt = doc.createTextNode( value.toString() );
  } else {
   txt = doc.createTextNode(object->metaObject()->property(i).typeName());
  }
   el.appendChild(txt);
   root.appendChild(el);
 }


  QFile f(name);
  f.open(QIODevice::ReadWrite | QIODevice::Text);
  QTextStream stream(&f);
  doc.save(stream, 2);
  f.close();
  return true;
}

bool Serializer::_deserializeObject(QIODevice* input, QObject* object)
{
    QDomDocument doc;
    if (!doc.setContent(input))
        return false;
    QDomElement root = doc.documentElement();
    qDebug() << object->metaObject()->propertyCount();
    for(int i = 0; i < object->metaObject()->propertyCount(); i++)
    {
        QMetaProperty prop = object->metaObject()->property(i);
        QString propName = prop.name();
        if(propName == "objectName")
            continue;
        QDomNodeList nodeList = root.elementsByTagName(propName);
        if(nodeList.length() < 1)
            continue;
        QDomNode node = nodeList.at(0);
        QVariant value = object->property(propName.toLatin1().data());
        QString v = node.toElement().text();

        object->setProperty(propName.toLatin1().data(), QVariant(v));
    }
    return true;
}
#ifndef SERIALIZER_H
#define SERIALIZER_H

#include <QObject>
#include <QDomDocument>
#include <QFile>

class Serializer : public QObject
{
    Q_OBJECT
public:
    explicit Serializer(QObject *parent = 0);
    bool Serialize(QObject *object, QString name);
    template<class T>
    T* deserialize(QIODevice *input)
    {
        T* object = new T();
        if(_deserializeObject(input, object))
            return object;
        delete object;
        return NULL;
    }


    bool _deserializeObject(QIODevice* input, QObject* object);
signals:

public slots:

};

#endif // SERIALIZER_H
QFile f(fname);
f.open(QIODevice::ReadOnly);

QPushButton *ds = s.deserialize<QPushButton>(&f);
f.close();
setProperty: Property "modal" invalid, read-only or does not exist
setProperty: Property "frameGeometry" invalid, read-only or does not exist
setProperty: Property "normalGeometry" invalid, read-only or does not exist
setProperty: Property "x" invalid, read-only or does not exist
setProperty: Property "y" invalid, read-only or does not exist
setProperty: Property "frameSize" invalid, read-only or does not exist
setProperty: Property "width" invalid, read-only or does not exist
setProperty: Property "height" invalid, read-only or does not exist
setProperty: Property "rect" invalid, read-only or does not exist
setProperty: Property "childrenRect" invalid, read-only or does not exist
setProperty: Property "childrenRegion" invalid, read-only or does not exist
setProperty: Property "isActiveWindow" invalid, read-only or does not exist
setProperty: Property "focus" invalid, read-only or does not exist