qt 将一个类的数据持久化

1.概要

2.内容

在 Qt 中,持久化一个类的数据通常意味着将该类的数据保存到某种存储介质(如文件、数据库等),以便在程序重新启动或崩溃后可以恢复这些数据。以下是几种常见的方法来实现这一目标:

1. 使用 QSettings 进行简单数据持久化

QSettings 类非常适合用于保存和恢复应用程序的设置或简单的类数据。它支持将数据存储到注册表(Windows)或配置文件中(其他平台)。

#include <QSettings>
#include <QString>
#include <QVariant>

class MyClass {
public:
    MyClass() : name(""), age(0) {}
    MyClass(const QString& n, int a) : name(n), age(a) {}

    void save(QSettings& settings) const {
        settings.setValue("name", name);
        settings.setValue("age", age);
    }

    void load(QSettings& settings) {
        name = settings.value("name").toString();
        age = settings.value("age").toInt();
    }

private:
    QString name;
    int age;
};

// 使用示例
int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    QSettings settings("MyCompany", "MyApp");

    MyClass obj("John Doe", 30);
    obj.save(settings);

    MyClass loadedObj;
    loadedObj.load(settings);

    return 0;
}

2. 使用 QDataStream 进行文件持久化

QDataStream 类允许你将数据序列化为二进制格式或文本格式,并将其写入文件或从文件中读取。

#include <QFile>
#include <QDataStream>
#include <QString>

class MyClass {
public:
    MyClass() : name(""), age(0) {}
    MyClass(const QString& n, int a) : name(n), age(a) {}

    void save(const QString& filename) const {
        QFile file(filename);
        if (!file.open(QIODevice::WriteOnly)) {
            qWarning("Could not open file for writing");
            return;
        }
        QDataStream out(&file);
        out << name << age;
    }

    void load(const QString& filename) {
        QFile file(filename);
        if (!file.open(QIODevice::ReadOnly)) {
            qWarning("Could not open file for reading");
            return;
        }
        QDataStream in(&file);
        in >> name >> age;
    }

private:
    QString name;
    int age;
};

// 使用示例
int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    MyClass obj("Jane Doe", 25);
    obj.save("mydata.dat");

    MyClass loadedObj;
    loadedObj.load("mydata.dat");

    return 0;
}

3. 使用 SQLite 数据库进行持久化

对于更复杂的数据或需要更强大查询功能的情况,可以使用 SQLite 数据库。Qt 提供了 QSqlDatabaseQSqlQuery 等类来简化数据库操作。

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>

class MyClass {
public:
    MyClass() : id(-1), name(""), age(0) {}
    MyClass(int i, const QString& n, int a) : id(i), name(n), age(a) {}

    void save() const {
        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
        db.setDatabaseName("mydata.db");
        if (!db.open()) {
            qDebug() << "Could not open database";
            return;
        }

        QSqlQuery query;
        query.prepare("INSERT INTO people (id, name, age) VALUES (:id, :name, :age)");
        query.bindValue(":id", id);
        query.bindValue(":name", name);
        query.bindValue(":age", age);
        query.exec();
    }

    void load(int id) {
        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
        db.setDatabaseName("mydata.db");
        if (!db.open()) {
            qDebug() << "Could not open database";
            return;
        }

        QSqlQuery query;
        query.prepare("SELECT name, age FROM people WHERE id = :id");
        query.bindValue(":id", id);
        if (query.exec() && query.next()) {
            name = query.value(0).toString();
            age = query.value(1).toInt();
        }
    }

private:
    int id;
    QString name;
    int age;
};

// 使用示例
int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("mydata.db");
    if (!db.open()) {
        qDebug() << "Could not open database";
        return -1;
    }

    QSqlQuery query;
    query.exec("CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)");

    MyClass obj(1, "Alice", 30);
    obj.save();

    MyClass loadedObj;
    loadedObj.load(1);

    return 0;
}

这三种方法各有优缺点,选择哪一种取决于你的具体需求,如数据量、数据复杂度、性能要求等。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值