Qt 在控件实现上覆盖类属性
Qt Override class properties on control deserealization
我试图进行简单的控制实现/反序列化,我想出了以下代码(.cpp(
#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;
}
.h 文件 :
#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
因此,在我序列化例如某些按钮之后,对于要反序列化它的xml文件,我这样做:
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
所以我的问题,有没有办法以某种方式进行适当的转换,或者我应该对 QPushButton 进行子类化并公开这些属性?如何在子类中覆盖这些属性?
尝试保存所有属性是没有意义的。
QMetaProperty
有很多标志可以帮助您过滤应保存的属性(应避免使用非"存储"和非"可写"属性(。
另请参阅Qt的属性系统。
例如,属性x
、y
和width
、height
是非writable
的,但分别是pos
和size
属性的一部分,它们是writable
的,但不是stored
的,因为它们本身是较大属性geometry
的一部分,这是你真正需要保存和恢复的唯一属性, 您可以检查此属性是否既stored
又writable
。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 使用ios:ate写入到流会覆盖现有文件
- C++概念:如何使用'concept'检查模板化结构的属性?
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 通过指向指针数组的指针访问子类的属性
- MSVC是否支持C++11样式的属性而不是__declspec
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 类的C++属性似乎已重新初始化
- 我可以重新分配/覆盖std::字符串吗
- Qt Quick-如何仅从c++代码与qml属性交互
- 用概念检查属性的类型
- 叮叮当当在修复时插入多个"覆盖"说明符
- 谷歌模拟和覆盖关键字
- C++如何将同一类的实例作为属性
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 按多个属性排序
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 覆盖抽象类的属性
- 用静态数组覆盖指针属性
- Qt 在控件实现上覆盖类属性