Qt 小项目 学生管理信息系统

主要是对数据库的增删查改的操作

登录/注册界面:

主页面: 

添加信息:

删除信息:

删除第一行(支持多行删除) 

需求分析:

用QT实现一个学生管理信息系统,数据库为MySQL
要求:
- 1、要求有完整界面,如登录界面、信息操作界面
- 2、要求有数据库
- 3、可以录入学生信息
- 4、可以查询学生信息,支持模糊查询
- 5、可以修改学生信息,支持单个和批量修改
- 6、可以删除学生信息,支持单个和批量删除
- 7、学生信息包括:班级、学号、姓名、性别、出生年月、专业、所属学院

2024.11.30 bug和所需添加记录:
- 注册账号时空值也会新建(已解决)
- 数据库sql语句写在qt上,方便运行(已解决)
- 用户名规则,开头字母

2024.12.6 bug记录
- 相同账号和不同密码,弹出信息框错误(已解决)
- 代码耦合:qt数据库常量抽取出来(已解决)
- 添加信息后没有刷新信息

登录界面:

Login.h

#ifndef LOGIN_H
#define LOGIN_H#include <QWidget>
#include <QSqlDatabase> //数据库驱动
#include <QSqlQuery> //数据库执行语句
#include <QSqlError> //数据库报错
#include <QMessageBox> //消息对话框
#include <QDebug>QT_BEGIN_NAMESPACE
namespace Ui {
class Login;
}
QT_END_NAMESPACEclass Login : public QWidget
{Q_OBJECTpublic:Login(QWidget *parent = nullptr);~Login();void createDataBase();private slots:void on_loginbutton_clicked();void on_registerbtn_clicked();private:Ui::Login *ui;
};
#endif // LOGIN_H

Login.cpp

#include "login.h"
#include "ui_login.h"
#include "homepage.h"
#define databaseName "qt"Login::Login(QWidget *parent): QWidget(parent), ui(new Ui::Login)
{ui->setupUi(this);//加载驱动QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");db.setHostName("127.0.0.1"); // 主机IPdb.setUserName("root"); // 用户名db.setPassword(""); // 密码if (!db.open()) {qDebug() << "WARNING: " << db.lastError().text();return; // 如果连接失败,退出函数}// qDebug() << databaseName;// 检查数据库 qt 是否存在QSqlQuery query;if (!query.exec("CREATE DATABASE IF NOT EXISTS " databaseName)) {qDebug() << "创建数据库" << databaseName << "失败:" << query.lastError().text();return; // 数据库创建失败,退出函数}else{qDebug() << "数据库" << databaseName << "已存在!";}db.setDatabaseName(databaseName); // 现在切换到 qt 数据库if (!db.open()) {qDebug() << "WARNING: 无法打开 " << databaseName << "数据库:" << db.lastError().text();return; // 如果无法连接到 qt,退出函数}// 数据库连接成功,继续后续操作qDebug() << "成功创建数据库!" << databaseName ;createDataBase();
}//sql语句创建数据库
void Login::createDataBase() {// 创建user表的SQL语句QString createUserTable = "CREATE TABLE IF NOT EXISTS `user` (""`account` VARCHAR(20) NOT NULL, ""`pwd` VARCHAR(20) NOT NULL, ""PRIMARY KEY (`account`))";// 创建student表的SQL语句QString createStudentTable = "CREATE TABLE IF NOT EXISTS `student` (""`id` INT(5) NOT NULL, ""`name` VARCHAR(20) NOT NULL, ""`gender` VARCHAR(2) NOT NULL, ""`birthdate` VARCHAR(10) NOT NULL, ""`major` VARCHAR(20) NOT NULL, ""`class` VARCHAR(20) NOT NULL, ""`college` VARCHAR(20) NOT NULL, ""PRIMARY KEY (`id`))";// 执行创建表的SQL语句QSqlQuery query;if (query.exec(createUserTable) && query.exec(createStudentTable)) {qDebug() << "数据库创建成功";} else {qDebug() << "数据库创建失败" << query.lastError().text();}}void Login::on_loginbutton_clicked() //登录功能
{QString account = ui->account->text();QString password = ui->pwd->text();QString sql = QString("select * from user where account='%1' and pwd='%2'").arg(account).arg(password);QSqlQuery query(sql);if(query.next()){QMessageBox::information(this, "登录认证", "登录成功");//登录成功后可以跳转到主页面HomePage *window = new HomePage();window->show();this->close(); //关闭登录窗口}else{QMessageBox::information(this, "登录认证", "登录失败,账户或者密码错误");}// HomePage *window = new HomePage(); //测试专用// window->show();// this->close(); //关闭登录窗口
}void Login::on_registerbtn_clicked() //注册按钮
{QString account = ui->account->text().trimmed();QString password = ui->pwd->text().trimmed();//判断账号和密码是否为空if(account.isEmpty() || password.isEmpty()){QMessageBox::warning(this,"注册认证","账号或密码不能为空!");return; //退出函数}//相同账号,不同密码的情况:QString sql = QString("select * from user where account='%1'").arg(account);QSqlQuery query(sql);if(query.next()){QMessageBox::warning(this,"注册认证","账号已存在!");return; //退出函数}//注册账号sql = QString("insert into user(account,pwd) values('%1','%2');").arg(account).arg(password);if(query.exec(sql)){ //表中存在该账号和密码QMessageBox::information(this,"注册认证","注册失败!");}else{QMessageBox::information(this,"注册认证","注册成功!");}
}Login::~Login()
{delete ui;
}

Login.ui

学生管理信息系统界面:

HomePage.h

#ifndef HOMEPAGE_H
#define HOMEPAGE_H#include <QWidget>
#include <QSqlDatabase> //数据库驱动
#include <QSqlQuery> //数据库执行语句
#include <QSqlError> //数据库报错
#include <QMessageBox> //消息对话框
#include <QDebug>namespace Ui {
class HomePage;
}class HomePage : public QWidget
{Q_OBJECTpublic:explicit HomePage(QWidget *parent = nullptr);~HomePage();void initDatabase(); //加载数据库驱动函数void refreshTable(QString inquiresql); //刷新表格,查询数据库全部内容private slots:void on_refresh_btn_clicked();void on_delete_btn_clicked();void on_inquire_btn_clicked();void on_add_btn_clicked();void on_modify_btn_clicked();private:Ui::HomePage *ui;
};#endif // HOMEPAGE_H

HomePage.cpp

#include "homepage.h"
#include "ui_homepage.h"
#include "add.h"
#include "modify.h"
#define databaseName "qt"HomePage::HomePage(QWidget *parent): QWidget(parent), ui(new Ui::HomePage)
{ui->setupUi(this);initDatabase(); //加载数据库驱动//设置表头QStringList headerList; //定义headerList变量headerList << "选择栏" << "学号" << "姓名" << "性别" << "出生年月" << "专业" << "班级" << "学院"; //添加内容QFont font; //设置字号font.setPointSize(17);ui->tableWidget->setFont(font);ui->tableWidget->setColumnCount(headerList.size()); //设置列数=表头列数ui->tableWidget->setHorizontalHeaderLabels(headerList); //添加headerList到表头ui->tableWidget->setRowCount(3); //设置行数,不设置显示不出文本// 设置列表自动填充满窗口ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);// 设置输入框提示信息为占位符文本,一旦用户开始输入,提示信息会消失。ui->inquire_lineEdit->setPlaceholderText("支持模糊查询,输入姓名或者学号关键词");refreshTable(NULL);
}void HomePage::initDatabase(){ //加载数据库驱动函数QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");db.setHostName("127.0.0.1"); // 主机IPdb.setUserName("root"); // 用户名db.setPassword(""); // 密码db.setDatabaseName(databaseName); // 要连接哪个数据库,它的名字// 打开数据库,如果打不开就弹出报错对话框if(db.open() == false){qDebug() << "WARNING:" <<  db.lastError().text() << "\n";}// 打开成功qDebug() << "数据库成功打开" << "\n";
}void HomePage::refreshTable(QString inquiresql){//先【从最后往前】删除表格所有行for(int row = ui->tableWidget->rowCount()-1; row >= 0; row--){ui->tableWidget->removeRow(row);}QSqlQuery query;if(inquiresql.isEmpty()){QString sql = "select * from student";query.exec(sql);}else{query.exec(inquiresql);}//数据库查询并添加int row = 0;while(query.next()){int Old_RowCount = ui->tableWidget->rowCount(); //获取当前表格行数ui->tableWidget->setRowCount(Old_RowCount+1); //添加一行//第一列添加复选框QTableWidgetItem *checkbox = new QTableWidgetItem();checkbox->setCheckState(Qt::Unchecked); //设置非选中状态ui->tableWidget->setItem(row, 0, checkbox);//添加数据,未设置只读状态ui->tableWidget->setItem(row, 1, new QTableWidgetItem(query.value(0).toString())); // 学号ui->tableWidget->setItem(row, 2, new QTableWidgetItem(query.value(1).toString())); // 姓名ui->tableWidget->setItem(row, 3, new QTableWidgetItem(query.value(2).toString())); // 性别ui->tableWidget->setItem(row, 4, new QTableWidgetItem(query.value(3).toString())); // 出生年月ui->tableWidget->setItem(row, 5, new QTableWidgetItem(query.value(4).toString())); // 专业ui->tableWidget->setItem(row, 6, new QTableWidgetItem(query.value(5).toString())); // 班级ui->tableWidget->setItem(row, 7, new QTableWidgetItem(query.value(6).toString())); // 学院row++; //下一行}
}void HomePage::on_refresh_btn_clicked() //刷新学生信息
{QString nullString = NULL;refreshTable(nullString); //刷新表格
}void HomePage::on_delete_btn_clicked() //删除学生信息
{QList<QString> StudentId; //存储需要删除的学生id//遍历表格每一行for(int row = ui->tableWidget->rowCount()-1; row >= 0; row--){QTableWidgetItem *checkBoxItem = ui->tableWidget->item(row, 0); //读取勾选框的列表项if(checkBoxItem->checkState() == Qt::Checked){QTableWidgetItem *idItem = ui->tableWidget->item(row, 1); //读取id的列表项if (idItem) {StudentId.append(idItem->text());}}}//没勾选就不删了,退出函数if(StudentId.empty()){QMessageBox::information(this, "提示", "请先勾选需要删除的行");return;}//构建批量删除的SQL语句,参数化查询防止SQL注入QString sql = "DELETE FROM student WHERE id IN (";for (int i = 0; i < StudentId.size(); i++) {sql += "?";if (i < StudentId.size() - 1)sql += ",";}sql += ")";QSqlQuery query;query.prepare(sql);for (int i = 0; i < StudentId.size(); i++) {query.addBindValue(StudentId[i]);}if(query.exec()) {QString nullString = NULL;refreshTable(nullString); //删除成功后立即刷新表格QMessageBox::information(this, "成功", "删除成功!");} else {QMessageBox::information(this, "失败", "删除失败:" + query.lastError().text());}
}void HomePage::on_inquire_btn_clicked() //查询信息
{QString inquireString = ui->inquire_lineEdit->text().trimmed();QString sql = QString("select id, name, gender, birthdate, major, class, college from student where id like \"%1%2\" or name like \"%3%4\"").arg(inquireString, "%", inquireString, "%");refreshTable(sql);
}void HomePage::on_add_btn_clicked() //添加信息
{int Old_RowCount = ui->tableWidget->rowCount(); //获取当前表格行数ui->tableWidget->setRowCount(Old_RowCount+1); //添加一行add *window = new add();window->show();
}void HomePage::on_modify_btn_clicked() //根据学号修改信息
{Modify *window = new Modify();window->show();
}HomePage::~HomePage()
{delete ui;
}

HomePage.ui

添加信息界面:

add.h

#ifndef ADD_H
#define ADD_H#include <QWidget>
#include <QMessageBox> //消息对话框
#include <QDebug>
#include <QSqlDatabase> //数据库驱动
#include <QSqlQuery> //数据库执行语句
#include <QSqlError> //数据库报错namespace Ui {
class add;
}class add : public QWidget
{Q_OBJECTpublic:explicit add(QWidget *parent = nullptr);~add();private slots:void on_add_btn_clicked();private:Ui::add *ui;
};#endif // ADD_H

add.cpp

#include "add.h"
#include "ui_add.h"
#include "homepage.h"add::add(QWidget *parent): QWidget(parent), ui(new Ui::add)
{ui->setupUi(this);
}void add::on_add_btn_clicked()
{QString id = ui->id_linedit->text().trimmed();QString name = ui->name_lineEdit->text().trimmed();QString gender = ui->gender_lineEdit->text().trimmed();QString birthdate = ui->birth_lineEdit->text().trimmed();QString major = ui->major_lineEdit->text().trimmed();QString Class = ui->class_lineEdit->text().trimmed();QString college = ui->college_lineEdit->text().trimmed();//结束条件if(id.isEmpty() || name.isEmpty() || gender.isEmpty()|| birthdate.isEmpty() || major.isEmpty() || Class.isEmpty() || college.isEmpty()){QMessageBox::warning(this, "警告", "信息请填写完整!");return;}//判断学号是否存在,存在则结束QString sql = "select * from student where id = ?";QSqlQuery query;query.prepare(sql);query.bindValue("?", id);query.exec();if(query.next()){QMessageBox::warning(this, "警告", "学号已存在!");return;}//添加学生sql = QString("insert into student (id, name, gender, birthdate, major, class, college) values (\"%1\", \"%2\", \"%3\", \"%4\", \"%5\", \"%6\", \"%7\")").arg(id, name, gender, birthdate, major, Class, college);if(query.exec(sql)) {QMessageBox::information(this, "成功", "插入成功!");close(); //关闭窗口HomePage *homepage = new HomePage();homepage->refreshTable(NULL); //刷新表格}else {QMessageBox::information(this, "失败", "插入失败:" + query.lastError().text());}
}add::~add()
{delete ui;
}

add.ui

修改信息界面:

Modify.h

#ifndef MODIFY_H
#define MODIFY_H#include <QWidget>
#include <QMessageBox> //消息对话框
#include <QDebug>
#include <QSqlDatabase> //数据库驱动
#include <QSqlQuery> //数据库执行语句
#include <QSqlError> //数据库报错namespace Ui {
class Modify;
}class Modify : public QWidget
{Q_OBJECTpublic:explicit Modify(QWidget *parent = nullptr);~Modify();private slots:void on_modify_btn_clicked();private:Ui::Modify *ui;
};#endif // MODIFY_H

Modify.cpp

#include "modify.h"
#include "ui_modify.h"
#include "homepage.h"Modify::Modify(QWidget *parent): QWidget(parent), ui(new Ui::Modify)
{ui->setupUi(this);
}void Modify::on_modify_btn_clicked()
{QString id = ui->id_linedit->text().trimmed();QString name = ui->name_lineEdit->text().trimmed();QString gender = ui->gender_lineEdit->text().trimmed();QString birthdate = ui->birth_lineEdit->text().trimmed();QString major = ui->major_lineEdit->text().trimmed();QString Class = ui->class_lineEdit->text().trimmed();QString college = ui->college_lineEdit->text().trimmed();if(id.isEmpty() || name.isEmpty() || gender.isEmpty()|| birthdate.isEmpty() || major.isEmpty() || Class.isEmpty() || college.isEmpty()){QMessageBox::warning(this, "警告", "信息请填写完整!");return;}QSqlQuery query;QString sql = QString("update student set name = \"%1\"," "gender =\"%2\", birthdate =\"%3\", major = \"%4\", ""Class = \"%5\", college = \"%6\" where id =%7").arg(name, gender, birthdate, major, Class, college, id);if(query.exec(sql)){QMessageBox::information(this, "成功", "修改成功!");HomePage *homepage = new HomePage();QString nullString = NULL;homepage->refreshTable(nullString); //刷新表格close(); //关闭窗口}else{QMessageBox::information(this, "失败", "修改失败!");}
}Modify::~Modify()
{delete ui;
}

Modify.ui

参考资料:

【C++】C++ QT实现 学生信息管理系统(QT源码)【独一无二】_qt学生管理系统-CSDN博客

如何用qt实现学生信息管理系统_用qtcreater做一个学生信息管理系统-CSDN博客

Qt 学习第十一天:QTableWidget 的使用_qt tablewidget resize-CSDN博客

Qt 学习第十一天:QTableWidget 的使用_qt tablewidget resize-CSDN博客

Qt设计精美的登录注册界面(包含SQLite数据库应用)_qt登录界面设计-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/35537.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

核心网S6730-H48X6C-V2堆叠

核心网是电信网络的中枢,负责数据传输、服务提供和网络管理,对保障通信质量、支持新技术服务和维护网络安全至关重要。堆叠技术通过将多个网络设备逻辑上整合为一个单元,简化管理,提升网络可用性和性能,同时降低成本,增强网络扩展性。 堆叠在网络建设中至关重要,它通过…

教程: 5分钟部署 APIPark 开源 LLM Gateway 与 API 开放门户

极大简化了大语言模型调用的过程&#xff0c;无需复杂代码即可同时连接主流大语言模型&#xff0c;让企业更加快捷、安全地使用AI。喜欢或感兴趣的小伙伴们赶紧去体验吧&#xff01; &#x1f517;更详细使用教程可以查看&#xff1a;APIPark 产品使用文档 APIPark 提供出色的…

HTML5教程-表格宽度设置,最大宽度,自动宽度

HTML表格宽度 参考&#xff1a;html table width HTML表格是网页设计中常用的元素之一&#xff0c;可以用来展示数据、创建布局等。表格的宽度是一个重要的参数&#xff0c;可以通过不同的方式来设置表格的宽度&#xff0c;本文将详细介绍HTML表格宽度的不同设置方式和示例代…

RISC-V架构下OP-TEE 安全系统实践

安全之安全(security)博客目录导读 本篇博客&#xff0c;我们聚焦RISC-V 2024中国峰会上的RISC-V和OP-TEE结合的一个安全系统实践&#xff0c;来自芯来科技桂兵老师。 关于RISC-V TEE(可信执行环境)的相关方案&#xff0c;如感兴趣可参考RISC-V TEE(可信执行环境)方案初探 首…

RTK数据的采集方法

采集RTK&#xff08;实时动态定位&#xff09;数据通常涉及使用高精度的GNSS&#xff08;全球导航卫星系统&#xff09;接收器&#xff0c;并通过基站和流动站的配合来实现。本文给出RTK数据采集的基本步骤 文章目录 准备设备设置基站设置流动站数据采集数据存储与处理应用数据…

【银河麒麟操作系统真实案例分享】内存黑洞导致服务器卡死分析全过程

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 现象描述 机房显示器连接服务器后黑屏&#xff…

Mongodb副本集环境安全认证

我所配置的mongodb副本集群 step1启动 MongoDB 副本集的每一个节点 mongod --config=/usr/local/mongodb_wjx/wjx01/mongod.conf mongod --config=/usr/local/mongodb_wjx/wjx02/mongod.conf mongod --config=/usr/local/mongodb_wjx/wjx03/mongod.conf step2通过主节点添加管…

完美解决Qt Qml窗口全屏软键盘遮挡不显示

1、前提 说明&#xff1a;我使用的是第三方软键盘 QVirtualKeyboard QVirtualKeyboard: Qt5虚拟键盘支持中英文,仿qt官方的virtualkeyboard模块,但使用QWidget实现。 - Gitee.com 由于参考了几篇文章尝试但没有效果&#xff0c;链接如下&#xff1a; 文章一&#xff1a;可能…

在做题中学习(77):快排

解法&#xff1a;快排 思路&#xff1a; 1.快排排一趟&#xff0c;递归分出来的左区间和右区间&#xff08;一趟的思想&#xff0c;看我的前一个文章&#xff1a;颜色分类题解&#xff09; 2.递归&#xff1a;想清楚 函数头 和 返回条件怎么写 3.优化&#xff1a;等概率的取…

AUTO TECH China 2025 华南展:探索汽车技术的新纪元

AUTO TECH China 2025 华南展&#xff1a;探索汽车技术的新纪元 随着科技的日新月异&#xff0c;汽车行业正经历着前所未有的变革。从电动化、智能化到网联化&#xff0c;每一项新技术的应用都在重塑我们对汽车的认知。为了展示这些令人激动的创新成果&#xff0c;我们荣幸地宣…

C# RSA加密和解密,RSA生成私钥和公钥

C# RSA加密和解密&#xff0c;RSA生成私钥和公钥&#xff08;使用XML格式秘钥&#xff09; 目录 前言生成xml格式的公钥和私钥 PrivateKeyPublicKey测试加密、解密 方案1&#xff1a;RSA公钥加密&#xff0c;RSA私钥解密方案2&#xff1a;RSA私钥加密&#xff0c;RSA私钥解密…

指标加权评价方法

文章目录 层次分析法&#xff08;Analytic Hierarchy Process, AHP&#xff09;熵权法原理计算方法 Technique for Order Preference by Similarity to Ideal Solution(TOPSIS, 优劣解距离法)原理计算方法 层次分析法&#xff08;Analytic Hierarchy Process, AHP&#xff09; …

React第十七章(useRef)

useRef 当你在React中需要处理DOM元素或需要在组件渲染之间保持持久性数据时&#xff0c;便可以使用useRef。 import { useRef } from react; const refValue useRef(initialValue) refValue.current // 访问ref的值 类似于vue的ref,Vue的ref是.value&#xff0c;其次就是vu…

SpringBoot 赋能家乡特色推荐系统:高效架构与前沿技术集成

1 绪 论 1.1课题背景与意义 在Internet高速发展的今天&#xff0c;计算机的应用几乎完全覆盖我们生活的各个领域&#xff0c;互联网在经济&#xff0c;生活等方面有着举足轻重的地位&#xff0c;成为人们资源共享&#xff0c;信息快速传递的重要渠道。在中国&#xff0c;网上管…

国际知名会计事务所安永造访图为科技,探索财务管理全球化新路径

今日&#xff0c;全球领先的安永会计师事务所&#xff08;以下简称“安永”&#xff09;合伙人造访了图为信息科技&#xff08;深圳&#xff09;有限公司&#xff08;以下简称“图为科技”&#xff09;。 安永就财务管理工作的全球化战略提供专业指导意见&#xff0c;并为双方…

Java 实现手机号码归属地查询

1.pom坐标 <dependency><groupId>com.googlecode.libphonenumber</groupId><artifactId>geocoder</artifactId><version>2.205</version></dependency> 2.代码 package test;import com.alibaba.excel.util.StringUtils; im…

SIP系列七:ICE框架(P2P通话)

我的音视频/流媒体开源项目(github) SIP系列目录 目录 一、NAT 1、NAT介绍 2、NAT类型 2.1、 完全圆锥型NAT 2.2、受限圆锥型NAT 2.3、端口受限圆锥型NAT 2.4、对称NAT 3、NAT打洞 3.1、不同一NAT下 3.2、同一NAT下 二、ICE 三、ICE中的SDP 至此&#x…

python桌面工具

用处 使用该工具可以将excel内容转成SQL语句&#xff0c;可以使用到一些SQL的报表平台可以将json文件转成xlsx格式文件 前期准备 安装库 pip install pandas -i https://mirrors.aliyun.com/pypi/simplepip install wxpython -i https://mirrors.aliyun.com/pypi/simplepip i…

【Golang】Go语言编程思想(一):接口

接口 接口的概念 现在我们要实现一个函数&#xff0c;用于对给定的 url 进行解析&#xff0c;具体的代码实现如下&#xff1a; package mainimport ("fmt""io""net/http" )func retrieve(url string) string {resp, err : http.Get(url)if er…

SAP SD 如何设置交货单数量可修改为0

在日常运维中&#xff0c;销售订单可以被reject&#xff0c;但是交货单只能被物理删除 但是粗暴的物理删除&#xff0c;又会使得单据不连续&#xff0c;出现问题不好追溯 所以我们就可以通过将废弃的交货单的数量置为0 配置如下&#xff1a; C表示&#xff0c;创建的时候不可…