【问题标题】:Qt C++, save to file an hash of structuresQt C++,保存到文件结构的哈希
【发布时间】:2016-10-05 07:43:43
【问题描述】:

这是我的头文件的一个例子:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

//// spare classes
class Foo {
public:
    Foo() {}

    int a;
    QString b;
};

class Bar {
public:
    Bar() {}
    int c;
    QString d;
    QHash<QString, Foo> e;
};

//// widget
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    QHash<QString, Bar> database;

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

在主要的小部件类中,我有一个数据库,它是一个以 QString 作为键和一个 Bar 对象作为值的散列。 Bar 类包含另一个散列,其中 QString 作为键,Foo 对象作为值。

我想将数据库保存到二进制文件中。翻阅了一下,我发现我应该使用 QByteArray 和 QDataStream,但是在散列中使用对象而不是简单的变量让我抓狂。

【问题讨论】:

  • 我不明白这个问题。这是一个简单的序列化问题。最简单的方法是为每个类编写序列化函数。 1.写一个标题(例如魔术代码,版本,......以避免在以后的版本中出现问题)。 2. 序列化大小(k/v 对的数量)。 3. 序列化密钥。 4. 序列化值。 5. 重复 3 和 4 直到完成。

标签: qt file serialization hash save


【解决方案1】:

如果您为自定义类型定义 >> 和

#include <QtCore>

class Foo {

public:
    Foo() {}

    int a;
    QString b;
};

QDataStream &operator<<(QDataStream &ds, const Foo &obj)
{
   ds << quint32(obj.a) << obj.b;
   return ds;
}

QDataStream &operator>>(QDataStream &ds, Foo &obj)
{
    Foo foo;
    ds >> foo.a >> foo.b;
    obj = foo;
    return ds;
}

class Bar {

public:
    Bar() {}

    int c;
    QString d;
    QHash<QString, Foo> e;

};

QDataStream &operator<<(QDataStream &ds, const Bar &obj)
{
    ds << quint32(obj.c) << obj.d << obj.e;
    return ds;
}

QDataStream &operator>>(QDataStream &ds, Bar &obj)
{
    Bar bar;
    ds >> bar.c >> bar.d >> bar.e;
    obj = bar;
    return ds;
}

int main(int argc, char *argv[])
{    
    QFile db("db.bin");

    if (argc < 2) {
        Foo foo;
        foo.a = 128;
        foo.b = "foo";

        Bar bar;
        bar.c = 255;
        bar.d = "bar";
        bar.e["foo"] = foo;

        QHash<QString, Bar> database;
        database["bar"] = bar;

        if (db.open(QIODevice::WriteOnly)) {
            QDataStream serialize_stream(&db);
            serialize_stream << database;
        } else {
            qDebug() << db.errorString();
        }
    } else {
        if (db.open(QIODevice::ReadOnly)) {
            QDataStream serialize_stream(&db);

            QHash<QString, Bar> database;
            serialize_stream >> database;

            qDebug() << database["bar"].c;
            qDebug() << database["bar"].d;
            qDebug() << database["bar"].e["foo"].a;
            qDebug() << database["bar"].e["foo"].b;
        } else {
            qDebug() << db.errorString();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2015-09-22
    • 1970-01-01
    相关资源
    最近更新 更多