26、Qt数据库编程:SQLite基础、QSqlDatabase、QSqlQuery、QSqlTableModel、数据可视化
说实话,数据库编程这块,很多初学者一听就头大。觉得又是SQL又是连接又是模型的,太复杂了。但我跟你说,Qt里操作SQLite,其实比你想的简单得多。我当年第一次在项目里用SQLite做本地数据存储,从零到跑通,也就花了一个下午。今天咱们就把这块彻底捋清楚。
SQLite是什么?为什么Qt偏爱它?
SQLite是一个轻量级的嵌入式数据库。说白了,它不需要单独安装一个数据库服务器,你的程序直接读写一个文件就行。Qt官方对SQLite的支持非常完善,QSqlDatabase、QSqlQuery这些类就是专门为它设计的。
我个人习惯在以下场景用SQLite:
- 桌面软件的本地配置存储
- 离线数据缓存
- 小型单机应用的数据管理
- 原型开发阶段快速验证
第一步:连接数据库——QSqlDatabase
在Qt里操作数据库,第一步永远是创建连接。代码很简单:
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
// 添加SQLite数据库驱动
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
// 设置数据库文件路径
db.setDatabaseName("myapp.db");
// 打开数据库
if (!db.open()) {
qDebug() << "数据库打开失败:" << db.lastError().text();
return;
}
qDebug() << "数据库连接成功!";
嗯,这里要注意一点:addDatabase的第一个参数是驱动名,SQLite就是"QSQLITE"。如果你用的是MySQL或PostgreSQL,这里要换成对应的名字。不过咱们今天只聊SQLite。
addDatabase("QSQLITE", "main_connection")。
第二步:执行SQL语句——QSqlQuery
数据库连上了,接下来就是建表、增删改查。QSqlQuery就是干这个的。
建表与插入数据
QSqlQuery query;
// 创建表
bool ok = query.exec(
"CREATE TABLE IF NOT EXISTS students ("
" id INTEGER PRIMARY KEY AUTOINCREMENT,"
" name TEXT NOT NULL,"
" age INTEGER,"
" score REAL"
")"
);
if (!ok) {
qDebug() << "建表失败:" << query.lastError().text();
}
// 插入数据——用占位符方式,防止SQL注入
query.prepare("INSERT INTO students (name, age, score) VALUES (?, ?, ?)");
query.addBindValue("张三");
query.addBindValue(20);
query.addBindValue(92.5);
if (!query.exec()) {
qDebug() << "插入失败:" << query.lastError().text();
}
你想想看,如果直接用字符串拼接SQL,万一用户输入了单引号或者恶意SQL片段,程序就崩了。用prepare加addBindValue是最安全的做法。我早期写代码时偷懒直接拼字符串,结果被测试同事发现了一个SQL注入漏洞,那次之后我就再也不敢了。
查询数据
query.exec("SELECT id, name, age, score FROM students");
while (query.next()) {
int id = query.value(0).toInt();
QString name = query.value(1).toString();
int age = query.value(2).toInt();
double score = query.value(3).toDouble();
qDebug() << id << name << age << score;
}
query.next()每次移动一行,返回false时表示没有更多数据了。value的索引从0开始,对应SELECT语句里的字段顺序。你也可以用字段名:query.value("name"),这样更清晰。
第三步:用模型操作数据——QSqlTableModel
如果你觉得手写SQL太麻烦,Qt还提供了一个更高层的封装:QSqlTableModel。它把一张数据库表直接映射成一个可编辑的数据模型,配合QTableView使用,几乎不用写SQL。
#include <QSqlTableModel>
#include <QTableView>
// 创建模型
QSqlTableModel *model = new QSqlTableModel(this);
model->setTable("students");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select(); // 加载数据
// 设置表头显示名称
model->setHeaderData(0, Qt::Horizontal, "编号");
model->setHeaderData(1, Qt::Horizontal, "姓名");
model->setHeaderData(2, Qt::Horizontal, "年龄");
model->setHeaderData(3, Qt::Horizontal, "成绩");
// 创建视图并设置模型
QTableView *view = new QTableView(this);
view->setModel(model);
view->setSelectionMode(QAbstractItemView::SingleSelection);
view->setSelectionBehavior(QAbstractItemView::SelectRows);
view->setEditTriggers(QAbstractItemView::DoubleClicked);
这段代码跑起来,你就能看到一个完整的表格,双击单元格可以直接编辑数据。编辑策略OnManualSubmit的意思是:修改不会立刻写入数据库,需要你手动调用model->submitAll()才生效。这样你可以做撤销操作:model->revertAll()。
第四步:数据可视化——不止是表格
光有表格还不够,很多时候我们需要把数据用图表展示出来。Qt Charts模块可以帮你画柱状图、折线图、饼图等。
下面是一个简单的柱状图示例,展示每个学生的成绩:
#include <QtCharts/QChartView>
#include <QtCharts/QBarSeries>
#include <QtCharts/QBarSet>
#include <QtCharts/QBarCategoryAxis>
#include <QtCharts/QValueAxis>
// 从数据库查询数据
QSqlQuery query;
query.exec("SELECT name, score FROM students");
QBarSet *set = new QBarSet("成绩");
QStringList categories;
while (query.next()) {
categories << query.value(0).toString();
*set << query.value(1).toDouble();
}
// 创建柱状图系列
QBarSeries *series = new QBarSeries();
series->append(set);
// 创建图表
QChart *chart = new QChart();
chart->addSeries(series);
chart->setTitle("学生成绩统计");
chart->setAnimationOptions(QChart::SeriesAnimations);
// 设置X轴
QBarCategoryAxis *axisX = new QBarCategoryAxis();
axisX->append(categories);
chart->addAxis(axisX, Qt::AlignBottom);
series->attachAxis(axisX);
// 设置Y轴
QValueAxis *axisY = new QValueAxis();
axisY->setRange(0, 100);
axisY->setTitleText("分数");
chart->addAxis(axisY, Qt::AlignLeft);
series->attachAxis(axisY);
// 显示图表
QChartView *chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
这段代码把数据库里的学生姓名和成绩读出来,直接画成柱状图。你还可以换成饼图显示各科成绩占比,或者折线图显示成绩变化趋势。说白了,数据可视化就是让数字说话,让用户一眼看出规律。
知识体系总览
下面这张图帮你理清今天讲的所有内容之间的关系:
总结一下今天的核心要点
- QSqlDatabase:负责建立和管理数据库连接。记住要指定驱动类型和文件路径。
- QSqlQuery:手写SQL,适合复杂查询。一定要用prepare+addBindValue防止SQL注入。
- QSqlTableModel:模型驱动,适合快速展示和编辑整张表。配合QTableView使用效果最佳。
- 数据可视化:用Qt Charts把数据库里的数字变成图表,让数据自己说话。
我个人觉得,学数据库编程最好的方式就是动手。打开Qt Creator,新建一个项目,连上SQLite,建一张表,插入几条数据,然后用QTableView显示出来。整个过程半小时就能跑通。等你跑通了,再试着加一个柱状图,成就感会非常强。
好了,今天的内容就到这里。记住,数据库编程没那么可怕,Qt已经帮你把最麻烦的部分都封装好了。你只需要理解这几个核心类,就能搞定大部分本地数据存储的需求。