一、项目简介

基于 QWidget + SQLite + QTableView + QSqlQuery 实现学生管理系统,功能:

  1. 初始化数据库、学生表
  2. 新增学生信息
  3. 修改选中行数据
  4. 删除学生记录
  5. 表格实时展示所有数据

二、模块引入

.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();
}

四、运行效果

  1. 首次运行自动生成 student.db 数据库文件;
  2. 输入学号、姓名、年龄,点击新增写入数据库;
  3. 选中表格行,修改输入框内容后点击修改
  4. 选中行点击删除移除数据;
  5. 刷新按钮重载整张表数据。

五、核心要点

  1. QSqlTableModel 快速绑定数据表,无需手动解析数据;
  2. 预处理语句 prepare + bindValue 防止 SQL 注入;
  3. QTableView + 模型视图架构解耦界面与数据;
  4. SQLite 为文件型数据库,无需额外部署服务。

小结

本项目是 Qt + 数据库 标准实战案例,完整覆盖增删改查、表格展示、数据校验,可扩展分页、条件查询、导出 Excel 等功能

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐