2012-12-12 46 views
14

私はReading/writing QObjects を使用しますか? 私はそれを使ってクラスをシリアライズしますが、逆シリアル化するときは元のクラスではありません!Qtでカスタムクラスをシリアライズ

私は何ができますか?

これが私の基本クラスのヘッダーです:

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 "" 

答えて

11

あなたはメタオブジェクトのプロパティシステムとそれを処理するためにQ_PROPERTYとしてidNameを行う必要があります。

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を参照してください。

+0

はい、ありがとう、ありがとう、 –

+0

はい、それは動作しますので、ありがとう、ありがとう、しかし私はQ_PROPERTYは何ですか?彼の議論は何ですか? READとは何ですか?書き込みは何ですか?彼らは構文ですか?どのようにテーマを学ぶことができますか?再度助けてください、ありがとう –

+1

ドキュメントを読んでください。 metaObjectシステムについて読む。すべてがドキュメントです。ドキュメントの中に何か不明な点がある場合は、別の質問をしてください。 –

関連する問題