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 提供了 QSqlDatabase、QSqlQuery 等类来简化数据库操作。
#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;
}
这三种方法各有优缺点,选择哪一种取决于你的具体需求,如数据量、数据复杂度、性能要求等。

1885

被折叠的 条评论
为什么被折叠?



