【问题标题】:Serializing my custom class in Qt在 Qt 中序列化我的自定义类
【发布时间】:2012-11-29 21:18:33
【问题描述】:

我使用Reading/writing QObjects 是真的吗? 我用它序列化一个类,但是反序列化它不是原始类!

我能做什么?

这是我的基类标题:

class Base : public QObject
{
    Q_OBJECT
public:
    explicit Base(QObject *parent = 0);


};
QDataStream &operator<<(QDataStream &ds, const Base &obj);
QDataStream &operator>>(QDataStream &ds, Base &obj) ;

而 .cpp 是:

Base::Base(QObject *parent) :
    QObject(parent)
{
}
QDataStream &operator<<(QDataStream &ds, const Base &obj) {
    for(int i=0; i<obj.metaObject()->propertyCount(); ++i) {
        if(obj.metaObject()->property(i).isStored(&obj)) {
            ds << obj.metaObject()->property(i).read(&obj);

        }
    }
    return ds;
}
QDataStream &operator>>(QDataStream &ds, Base &obj) {
    QVariant var;
    for(int i=0; i<obj.metaObject()->propertyCount(); ++i) {
        if(obj.metaObject()->property(i).isStored(&obj)) {
            ds >> var;
            obj.metaObject()->property(i).write(&obj, var);
        }
    }
    return ds;
}

我有一个从基类继承的学生类:

class student : public Base
{
public:
    student();
    int id;
    QString Name;
};

这是我的主要:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    student G;
    student G2;
    G.id=30;
    G.Name="erfan";
    qDebug()<<G.id<<G.Name;
    QFile file("file.dat");
    file.open(QIODevice::WriteOnly);

    QDataStream out(&file);   // we will serialize the data into the file
    out <<G;
    qDebug()<<G2.id<<G2.Name;
    file.close();
    file.open(QIODevice::ReadOnly);
    out>>G2;
    qDebug()<<G2.id<<G2.Name;

    return a.exec();
}

这是我的输出:

30 "erfan" 
1498018562 "" 
1498018562 ""

【问题讨论】:

    标签: c++ qt serialization qobject


    【解决方案1】:

    您必须将 idName 设为 Q_PROPERTY 才能使用 metaObject 属性系统处理它:

    class student : public Base
    {
        Q_OBJECT // Q_OBJECT macro will take care of generating proper metaObject for your class
        Q_PROPERTY(int id READ getId WRITE setId)
        Q_PROPERTY(QString Name READ getName WRITE setName)
    public:
        student();
        int getId() const { return id; }
        void setId(int newId) { id = newId; }
        QString getName() const { return Name; }
        void setName(const QString &newName) { Name = newName; }
    
    private:
        int id;
        QString Name;
    };
    

    现在应该以适当的方式处理属性。

    有关详细信息,请参阅http://doc.qt.io/qt-5/properties.html

    【讨论】:

    • 是的,它有效,非常感谢,非常感谢,但我有一个问题,Q_PROPERTY 是什么?他的论点是什么?什么是读? WRITE 是什么名字?它们是语法吗?我怎样才能学习主题?请再次帮助我,谢谢
    • 阅读文档。阅读有关元对象系统的信息。一切都是文档。如果您不清楚文档中的某些内容,请再问一个问题。
    猜你喜欢
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2017-01-21
    • 1970-01-01
    • 2022-09-23
    相关资源
    最近更新 更多