web-dev-qa-db-ja.com

Qtでカスタムクラスをシリアル化する

私は使用します 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 ""
18
Erfan Tavakoli

MetaObjectプロパティシステムで処理するには、idNameをQ_PROPERTYとして作成する必要があります。

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

15
Kamil Klimek