Pytanie Serializing mojej niestandardowej klasy w Qt


używam Odczyt / zapis QObjects  czy to prawda? Serializuję klasę, ale gdy deserializuję, nie jest to oryginalna klasa!

co mogę zrobić?

to jest mój nagłówek klasy podstawowej:

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

a .cpp to:

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

i mam klasę studentów, która dziedziczy z bazy:

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

i to jest moja główna sprawa:

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

i to jest moje wyjście:

30 "erfan" 
1498018562 "" 
1498018562 ""

16
2017-12-12 07:54


pochodzenie




Odpowiedzi:


Musisz zrobić id i Name jako Q_PROPERTY, aby obsłużyć go za pomocą systemu właściwości 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;
};

Teraz właściwości powinny być obsługiwane we właściwy sposób.

Widzieć http://doc.qt.io/qt-5/properties.html dla szczegółowych informacji.


13
2017-12-12 08:12



TAK, działa, więc dziękuję, dzięki, - Erfan Tavakoli
TAK, działa, więc dziękuję, dzięki, ale mam pytanie, co to jest Q_PROPERTY? jakie są jego argumenty? co to jest READ? czym jest WRITE, czy to imię? czy oni są składni? Jak mogę się nauczyć tematu? proszę, pomóż mi jeszcze raz, dzięki - Erfan Tavakoli
Przeczytaj dokumenty. Przeczytaj o systemie metaObject. Wszystko jest dokumentami. Jeśli coś w dokumentach jest dla ciebie niejasne, zadaj kolejne pytanie. - Kamil Klimek