2012-12-12 17 views
14

io uso Reading/writing QObjects è vero? serializzo una classe con essa ma quando deserializza non è la classe originale!Serializzare la mia classe personalizzata in Qt

cosa posso fare?

questo è il mio colpo di testa classe di base:

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) ; 

e 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; 
} 

e ho una classe studente che ereditano dalla base:

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

e è il mio principale:

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(); 
} 

ed è la mia uscita:

30 "erfan" 
1498018562 "" 
1498018562 "" 

risposta

11

È necessario rendere id e Name come Q_PROPERTY di gestire la cosa con il sistema di proprietà 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; 
}; 

Ora proprietà devono essere trattati in modo corretto.

Vedere http://doc.qt.io/qt-5/properties.html per informazioni dettagliate.

+0

Sì, funziona, quindi grazie, quindi grazie, –

+0

sì, funziona, quindi grazie, quindi grazie, ma ho una domanda, qual è il Q_PROPERTY? quali sono i suoi argomenti? cosa è LEGGI? cosa è WRITE sono un nome? sono sintassi? come posso imparare il tema? per favore aiutatemi ancora, grazie –

+1

Leggi i documenti. Leggi informazioni sul sistema metaObject. Tutto è doc. Se qualcosa nei documenti non ti è chiaro, fai un'altra domanda. –

Problemi correlati