Qt 实战 04|QWidget + SQLite 学生管理系统 表格展示 + 增删改查
·
一、项目简介
基于 QWidget + SQLite + QTableView + QSqlQuery 实现学生管理系统,功能:
- 初始化数据库、学生表
- 新增学生信息
- 修改选中行数据
- 删除学生记录
- 表格实时展示所有数据
二、模块引入
.pro 添加数据库模块:
pro
QT += core gui widgets sql
三、完整代码实现
1. 主窗口头文件 studentmgr.h
cpp
运行
#ifndef STUDENTMGR_H
#define STUDENTMGR_H
#include <QMainWindow>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlTableModel>
#include <QTableView>
#include <QPushButton>
#include <QLineEdit>
#include <QLabel>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QMessageBox>
class StudentMgr : public QMainWindow
{
Q_OBJECT
public:
explicit StudentMgr(QWidget *parent = nullptr);
~StudentMgr();
private slots:
void initDB(); // 初始化数据库
void addStudent(); // 新增
void editStudent(); // 修改
void delStudent(); // 删除
void refreshData(); // 刷新表格
private:
QSqlTableModel *m_model;
QTableView *m_view;
QLineEdit *editId;
QLineEdit *editName;
QLineEdit *editAge;
};
#endif // STUDENTMGR_H
2. 源文件 studentmgr.cpp
cpp
运行
#include "studentmgr.h"
StudentMgr::StudentMgr(QWidget *parent)
: QMainWindow(parent)
{
this->setWindowTitle("学生信息管理系统");
this->resize(600, 450);
// 输入控件
editId = new QLineEdit;
editId->setPlaceholderText("学号");
editName = new QLineEdit;
editName->setPlaceholderText("姓名");
editAge = new QLineEdit;
editAge->setPlaceholderText("年龄");
QPushButton *btnAdd = new QPushButton("新增");
QPushButton *btnEdit = new QPushButton("修改");
QPushButton *btnDel = new QPushButton("删除");
QPushButton *btnRefresh = new QPushButton("刷新");
// 表格视图
m_view = new QTableView;
m_model = new QSqlTableModel(this);
// 布局
QHBoxLayout *editLay = new QHBoxLayout;
editLay->addWidget(editId);
editLay->addWidget(editName);
editLay->addWidget(editAge);
editLay->addWidget(btnAdd);
editLay->addWidget(btnEdit);
editLay->addWidget(btnDel);
editLay->addWidget(btnRefresh);
QVBoxLayout *mainLay = new QVBoxLayout;
mainLay->addLayout(editLay);
mainLay->addWidget(m_view);
QWidget *centralWid = new QWidget(this);
centralWid->setLayout(mainLay);
setCentralWidget(centralWid);
// 信号槽
connect(btnAdd, &QPushButton::clicked, this, &StudentMgr::addStudent);
connect(btnEdit, &QPushButton::clicked, this, &StudentMgr::editStudent);
connect(btnDel, &QPushButton::clicked, this, &StudentMgr::delStudent);
connect(btnRefresh, &QPushButton::clicked, this, &StudentMgr::refreshData);
initDB();
}
StudentMgr::~StudentMgr()
{
}
// 初始化SQLite数据库与表
void StudentMgr::initDB()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("student.db");
if(!db.open())
{
QMessageBox::critical(this, "错误", "数据库打开失败");
return;
}
// 创建学生表:学号(主键)、姓名、年龄
QSqlQuery query;
QString sql = R"(
CREATE TABLE IF NOT EXISTS student(
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER
)
)";
query.exec(sql);
// 绑定表格模型
m_model->setTable("student");
m_model->select();
m_view->setModel(m_model);
m_view->horizontalHeader()->setStretchLastSection(true);
}
// 新增学生
void StudentMgr::addStudent()
{
QString id = editId->text();
QString name = editName->text();
QString age = editAge->text();
if(id.isEmpty() || name.isEmpty() || age.isEmpty())
{
QMessageBox::warning(this, "提示", "请填写完整信息");
return;
}
QSqlQuery query;
query.prepare("INSERT INTO student(id,name,age) VALUES(:id,:name,:age)");
query.bindValue(":id", id);
query.bindValue(":name", name);
query.bindValue(":age", age);
if(query.exec())
{
QMessageBox::information(this, "成功", "添加完成");
refreshData();
editId->clear(); editName->clear(); editAge->clear();
}
}
// 修改选中行
void StudentMgr::editStudent()
{
QModelIndex idx = m_view->currentIndex();
if(!idx.isValid())
{
QMessageBox::warning(this, "提示", "请先选中一行数据");
return;
}
QString id = editId->text();
QString name = editName->text();
QString age = editAge->text();
if(id.isEmpty() || name.isEmpty()) return;
QString oldId = m_model->data(m_model->index(idx.row(), 0)).toString();
QSqlQuery query;
query.prepare("UPDATE student SET id=:id,name=:name,age=:age WHERE id=:oldid");
query.bindValue(":id", id);
query.bindValue(":name", name);
query.bindValue(":age", age);
query.bindValue(":oldid", oldId);
if(query.exec())
{
QMessageBox::information(this, "成功", "修改完成");
refreshData();
}
}
// 删除选中行
void StudentMgr::delStudent()
{
QModelIndex idx = m_view->currentIndex();
if(!idx.isValid())
{
QMessageBox::warning(this, "提示", "请先选中一行数据");
return;
}
if(QMessageBox::question(this, "确认", "确定删除该条记录?") != QMessageBox::Yes)
return;
m_model->removeRow(idx.row());
m_model->submitAll();
refreshData();
}
// 刷新表格数据
void StudentMgr::refreshData()
{
m_model->select();
}
四、运行效果
- 首次运行自动生成
student.db数据库文件; - 输入学号、姓名、年龄,点击新增写入数据库;
- 选中表格行,修改输入框内容后点击修改;
- 选中行点击删除移除数据;
- 刷新按钮重载整张表数据。
五、核心要点
QSqlTableModel快速绑定数据表,无需手动解析数据;- 预处理语句
prepare + bindValue防止 SQL 注入; QTableView+ 模型视图架构解耦界面与数据;- SQLite 为文件型数据库,无需额外部署服务。
小结
本项目是 Qt + 数据库 标准实战案例,完整覆盖增删改查、表格展示、数据校验,可扩展分页、条件查询、导出 Excel 等功能
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)