金樽清酒斗十千,玉盘珍羞直万钱。
停杯投箸不能食,拔剑四顾心茫然。
欲渡黄河冰塞川,将登太行雪满山。
闲来垂钓碧溪上,忽复乘舟梦日边。
行路难!行路难!多歧路,今安在?
长风破浪会有时,直挂云帆济沧海。
—唐.李白

一.总体分析

通过在需求阶段对系统的总体功能的分析,我们得到了这个学生信息管理系统的总体功能结构,其主要功能如上面的功能结构图所示。它应包括四大基本功能模块。
(1)信息增加模块:通过增加用户信息、管理员信息、班级信息,使得整个学生信息管理系统能够获得数据的输入,为整个学生信息管理系统的操作提供了必要的条件。
(2)信息删除模块:通过删除用户信息、管理员信息、班级信息,使得学生信息管理系统中的无用数据能够及时清除,从而更好的管理有效数据。
(3)信息修改模块:通过修改用户信息、管理员信息、班级信息,使得学生信息管理系统中的信息能够得到及时的更新,保证了系统信息的实时性。
(4)信息查看模块:对于管理员来说,信息能被查看,才能去执行其他的操作。对于学生来说,查看自己的数据和修改密码是仅有的操作。

二.实现效果图

(1)管理员主要功能截图






(2)学生主要功能截图

三.软件代码分析

这个学生信息管理系统主要实现用qt布局和设计,增删改查数据库,所以主要的代码其实是数据库的代码。Qt连接Sqiite数据库虽然不像mysql那样需要安装驱动,但是要在如下图所示的文件中加上sql。

(1)首先是创建数据库和三个表的代码,我写在main函数里。创建表的同时插入了一些数据,作为示范,其中,管理员的账号和密码插入是初始化管理员登录,不然没有管理员也没有学生,就登不了系统。

int main(int argc, char *argv[])
{QApplication a(argc, argv);QSqlDatabase db= QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("StudentInformationManagementSystem.db");if ( !db.open()){qDebug()<<"没有打开!";}QSqlQuery query;//QSqlQuery类提供执行和操作的SQL语句的方法//创建数据库admin表query.exec("CREATE TABLE admin (""admin_account VARCHAR(40) PRIMARY KEY NOT NULL,""admin_password VARCHAR(40) NOT NULL)");//创建数据库student表query.exec("CREATE TABLE student (""id VARCHAR(50) PRIMARY KEY NOT NULL, ""name VARCHAR(30) NOT NULL, ""sex VARCHAR(10) NOT NULL, ""age INTEGER NOT NULL,""address VARCHAR(50) NOT NULL,""phone_number VARCHAR(30) NOT NULL,""password VARCHAR(30) NOT NULL,""dormitory VARCHAR(30) NOT NULL,""className VARCHAR(30) NOT NULL)");query.exec("CREATE TABLE class (""name VARCHAR(40) PRIMARY KEY NOT NULL, ""department VARCHAR(50) NOT NULL, ""instructor VARCHAR(40) NOT NULL, ""instructor_number VARCHAR(40) NOT NULL,""people_number INTEGER NOT NULL)");Login w;w.show();return a.exec();
}

(2)其次是登录管理员和学生的账号密码验证。根据选择的radioButton是管理员或者学生,分别去查阅数据库,管理员一一对照数据库中的账号密码(学生用户一一对照学号和密码)与输入框的账号密码对比。找到数据与之比较,正确则登录成功,失败则弹出账号或密码错误框。代码如下。

//点击登录
void Login::on_loginBtn_clicked()
{QString username = ui->zhanghao->text();QString password = ui->password->text();QSqlDatabase db;db = QSqlDatabase::addDatabase("QSQLITE");//指定SQLitedb.setDatabaseName("StudentInformationManagementSystem.db");//数据库if (!db.open())qDebug() << "连接失败";//如果管理员被选择if( ui->adminRadio->isChecked()){QSqlQuery query(db);db.exec("SET NAMES 'GBK'");//防止乱码query.exec("select admin_account,admin_password from admin");bool T1=false;while(query.next()){QString user = query.value(0).toString();QString pass = query.value(1).toString();if(username.compare(user)==0&&password.compare(pass)==0){T1=true;login_zhanghao=user;//将登录者的账号记录,就知道谁登录了。this->hide();admin=new adminFace;admin->show();}}if(T1==false)QMessageBox::information(this, "警告", "用户名或密码错误");}if( ui->studentRadio->isChecked()){QSqlQuery query(db);db.exec("SET NAMES 'GBK'");//防止乱码query.exec("select id,password from student");bool zhanghaoAndPassword=false;while(query.next()){QString user = query.value(0).toString();QString pass = query.value(1).toString();if(username.compare(user)==0&&password.compare(pass)==0){zhanghaoAndPassword=true;login_zhanghao=user;//记录学生的账号login_password=pass;//这里要记录学生的密码用于修改//this->hide();this->close();student=new studentFace;student->setModal(true);student->show();break;}}if(zhanghaoAndPassword==false)QMessageBox::information(this, "警告", "用户名或密码错误");}
}

(3)然后,我们会发现,上面的代码所示,登录窗口会被隐藏,创建了管理员界面,这就算是登录成功了。对于学生用户,登录成功后就会看见自己的信息,可以更改密码,这就算是全部操作了。对于管理员来说,登录后就能操作各种数据了。而三个表的操作都是增删改查,所以用管理员管理学生信息表作为例子。点击学生信息表之后,首先要让存在的学生信息显示出来,在tableview中以表格形式展现。代码写在构造方法里,如下:

 QSqlQuery query;QSqlQueryModel *model = new QSqlQueryModel(this);model->setQuery("select id,password,name,sex,age,address,phone_number,dormitory,className from student");//以下为展示的各列的名称model->setHeaderData(0,Qt::Horizontal,tr("学号"));model->setHeaderData(1,Qt::Horizontal,tr("密码"));model->setHeaderData(2,Qt::Horizontal,tr("姓名"));model->setHeaderData(3,Qt::Horizontal,tr("性别"));model->setHeaderData(4,Qt::Horizontal,tr("年龄"));model->setHeaderData(5,Qt::Horizontal,tr("籍贯"));model->setHeaderData(6,Qt::Horizontal,tr("联系电话"));model->setHeaderData(7,Qt::Horizontal,tr("寝室"));model->setHeaderData(8,Qt::Horizontal,tr("班级名称"));ui->tableView->setModel(model);

(4)最后一点核心代码是对数据库增删改查操作,同样以学生信息表为例。
1.增加学生信息

//确定提交数据
void admin_student_add::on_pushButton_clicked()
{QString addId=ui->idEdit->text();QString addPassword=ui->passwordEdit->text();QString addName=ui->nameEdit->text();QString addSex=ui->sexEdit->text();int addage=ui->ageEdit->text().toInt();QString address=ui->addressEdit->text();QString addPhone_number=ui->phone_numberEdit->text();QString addDormitory=ui->dormitoryEdit->text();QString addClassName=ui->classNameEdit->text();if(addId.isEmpty()||addName.isEmpty()||addPassword.isEmpty()||addSex.isEmpty()||addage<=0||address.isEmpty()||addPhone_number.isEmpty()||addDormitory.isEmpty()||addClassName.isEmpty()){QMessageBox::information(this, "警告", "未完全填写或填写错误");}else{QSqlQuery query;//判断输入学号是否存在于数据库中query.exec("select id from student");bool isExist=false;//是否存在while(query.next()){QString id=query.value(0).toString();if(id.compare(addId)==0){QMessageBox::information(this, "警告", "该账号已存在!");isExist=false;//this->close();break;}isExist=true;}//一开始没有任何数据的情况下,query.next()不会执行,所以会出现无响应情况,增加!query.next(),让第一个增加的数据能增加成功if(!query.next()){isExist=true;}if(isExist){QString sql=QString("insert into student(id,password,name,sex,age,address,phone_number,dormitory,className)values('%1','%2','%3','%4','%5','%6','%7','%8','%9')").arg(addId).arg(addPassword).arg(addName).arg(addSex).arg(addage).arg(address).arg(addPhone_number).arg(addDormitory).arg(addClassName);query.exec(sql);QMessageBox::information(this, "温馨提示", "恭喜,学号:"+addId+"添加成功");qDebug()<<addId+"添加成功";this->close();admin_student_show *newAdminStudentShow=new admin_student_show;newAdminStudentShow->show();}}
}

2.删除学生信息

//删除学生信息
void admin_student_show::on_pushButton_3_clicked()
{QString wantDeleteStuentId=ui->wantDeleteEdit->text();if(wantDeleteStuentId==""){QMessageBox::information(this, "警告", "您未输入想要删除的学生学号");return;};//判断输入想要删除的班级是否存在于数据库中QSqlQuery query;query.exec("select id from student");bool isExist=false;//是否存在while(query.next()){QString tempStudentId=query.value(0).toString();if(tempStudentId.compare(wantDeleteStuentId)==0){QString sql=QString("delete from student where id='%1'").arg(wantDeleteStuentId);query.exec(sql);QMessageBox::information(this, "温馨提示", "恭喜,学号:"+wantDeleteStuentId+"删除成功");qDebug()<<wantDeleteStuentId+"删除成功";isExist=false;//自动刷新表格this->close();admin_student_show *newAdminStudentShow=new admin_student_show;newAdminStudentShow->show();break;}isExist=true;}if(isExist){QMessageBox::information(this, "警告", "抱歉,不存在学号:"+wantDeleteStuentId);qDebug()<<wantDeleteStuentId+"删除失败";//this->close();ui->wantDeleteEdit->setText("");}
}

3.修改学生信息,需要先查找到该学生信息再修改

//更新修改数据
void admin_student_updata::on_pushButton_clicked()
{if(ifNotFindIdDo){ QMessageBox::information(this, "警告", "请先输入学号");return;}QString updateId=ui->updateIdEdit->text();QString updatePassword=ui->passwordEdit->text();QString updateName=ui->nameEdit->text();QString updateSex=ui->sexEdit->text();int updateage=ui->ageEdit->text().toInt();QString updatedress=ui->addressEdit->text();QString updatePhone_number=ui->phone_numberEdit->text();QString updateDormitory=ui->dormitoryEdit->text();QString updateClassName=ui->classNameEdit->text();if(updateId.isEmpty()||updateName.isEmpty()||updatePassword.isEmpty()||updateSex.isEmpty()||updateage<=0||updatedress.isEmpty()||updatePhone_number.isEmpty()||updateDormitory.isEmpty()||updateClassName.isEmpty()){QMessageBox::information(this, "警告", "未完全填写或填写错误");}else{QSqlQuery query;QString wantUpdateStudentId=ui->idEdit->text();QString sql=QString("update student set id='%1',password='%2',name='%3',sex='%4',age='%5',address='%6',phone_number='%7',dormitory='%8',className='%9' where id='%10'").arg(updateId).arg( updatePassword).arg( updateName).arg( updateSex).arg( updateage).arg( updatedress).arg( updatePhone_number).arg( updateDormitory).arg( updateClassName).arg(wantUpdateStudentId);query.exec(sql);QMessageBox::information(this, "温馨提示", "恭喜!信息修改成功!");qDebug()<<"修改成功";this->close();admin_student_show *newAdminStudentShow=new admin_student_show;newAdminStudentShow->show();
}
}
//想要更改的学生学号
void admin_student_updata::on_pushButton_3_clicked()
{QString wantUpdateStudentId=ui->idEdit->text();QSqlQuery query;//判断输入学号是否存在于数据库中QString sql=QString("select id from student where id='%1'").arg(wantUpdateStudentId);query.exec(sql);bool isExist=false;//是否存在while(query.next()){QString id=query.value(0).toString();if(id.compare(wantUpdateStudentId)==0){ifNotFindIdDo=false;isExist=true;//this->close();break;}isExist=false;}if(isExist){QSqlQuery query;QString sql=QString("select id,password,name,sex,age,address,phone_number,dormitory,className from student where id='%1'").arg(wantUpdateStudentId);query.exec(sql);while (query.next()) {QString Update_id=query.value(0).toString();QString Update_password=query.value(1).toString();QString Update_name=query.value(2).toString();QString Update_sex=query.value(3).toString();QString Update_age=query.value(4).toString();QString Update_address=query.value(5).toString();QString Update_phone_number=query.value(6).toString();QString Update_dormitory=query.value(7).toString();QString Update_className=query.value(8).toString();ui->updateIdEdit->setText(Update_id);ui->passwordEdit->setText(Update_password);ui->nameEdit->setText(Update_name);ui->sexEdit->setText(Update_sex);ui->ageEdit->setText(Update_age);ui->addressEdit->setText(Update_address);ui->phone_numberEdit->setText(Update_phone_number);ui->dormitoryEdit->setText(Update_dormitory);ui->classNameEdit->setText(Update_className);}}}

4.查看学生信息就不需要了,因为学生信息界面的tableview就能观看学生信息。

5.最后是查找信息,可以根据学号或姓名去查找学生信息,不存在则会提示,存在则显示。具体实现代码如下:

void admin_find_show::on_findBtn_clicked()
{QString findId= ui->id_find->text();QString findName=ui->name_find->text();//多表查询知识点 select table1.abc from table1 inner join table2 on table1.xxx=table2.xxx;QSqlQuery query1;//执行第一个sql语句QSqlQuery query2;//执行第二个sql语句if(!findId.isEmpty()){QString sqlById1=QString("select student.id,student.name,student.sex,student.age,student.address,student.phone_number,student.dormitory,class.name,class.department,class.instructor,class.instructor_number,class.people_number from student inner join class on student.className=class.name and student.id='%1'").arg(findId);query1.exec(sqlById1);bool Notfond=true;bool InfoNotAll=true;while (query1.next()) {QString id=query1.value(0).toString();QString name=query1.value(1).toString();QString sex=query1.value(2).toString();QString age=query1.value(3).toString();QString address=query1.value(4).toString();QString phoneNumber=query1.value(5).toString();QString dormitory=query1.value(6).toString();QString className=query1.value(7).toString();QString department=query1.value(8).toString();QString instructor=query1.value(9).toString();QString instructorPhone=query1.value(10).toString();//下面为查到的信息ui->IdLineEdit->setText(id);ui->NameLineEdit->setText(name);ui->SexLineEdit->setText(sex);ui->AgeLineEdit->setText(age);ui->AddressLineEdit->setText(address);ui->PhoneNumberLineEdit->setText(phoneNumber);ui->DormitoryLineEdit->setText(dormitory);ui->classLineEdit->setText(className);ui->DepartmentLineEdit->setText(department);ui->InstructorLineEdit->setText(instructor);ui->InstructorPhoneNumberLineEdit->setText(instructorPhone);Notfond=false;InfoNotAll=false;}if(InfoNotAll){QString sqlById2=QString("select student.id,student.name,student.sex,student.age,student.address,student.phone_number,student.dormitory from student where student.id='%1'").arg(findId);query2.exec(sqlById2);while (query2.next()) {QString id=query2.value(0).toString();QString name=query2.value(1).toString();QString sex=query2.value(2).toString();QString age=query2.value(3).toString();QString address=query2.value(4).toString();QString phoneNumber=query2.value(5).toString();QString dormitory=query2.value(6).toString();//下面为查到的信息ui->IdLineEdit->setText(id);ui->NameLineEdit->setText(name);ui->SexLineEdit->setText(sex);ui->AgeLineEdit->setText(age);ui->AddressLineEdit->setText(address);ui->PhoneNumberLineEdit->setText(phoneNumber);ui->DormitoryLineEdit->setText(dormitory);ui->classLineEdit->setText("null");ui->DepartmentLineEdit->setText("null");ui->InstructorLineEdit->setText("null");ui->InstructorPhoneNumberLineEdit->setText("null");Notfond=false;}}if(Notfond){QMessageBox::information(this, "警告", "未找到相关信息");this->close();admin_find_show *adminFindShow=new admin_find_show;adminFindShow->show();}}else{QString sqlByName1=QString("select student.id,student.name,student.sex,student.age,student.address,student.phone_number,student.dormitory,class.name,class.department,class.instructor,class.instructor_number,class.people_number from student inner join class on student.className=class.name and student.name='%1'").arg(findName);query1.exec(sqlByName1);bool Notfond=true;bool InfoNotAll=true;while (query1.next()) {QString id=query1.value(0).toString();QString name=query1.value(1).toString();QString sex=query1.value(2).toString();QString age=query1.value(3).toString();QString address=query1.value(4).toString();QString phoneNumber=query1.value(5).toString();QString dormitory=query1.value(6).toString();QString className=query1.value(7).toString();QString department=query1.value(8).toString();QString instructor=query1.value(9).toString();QString instructorPhone=query1.value(10).toString();//下面为查到的信息ui->IdLineEdit->setText(id);ui->NameLineEdit->setText(name);ui->SexLineEdit->setText(sex);ui->AgeLineEdit->setText(age);ui->AddressLineEdit->setText(address);ui->PhoneNumberLineEdit->setText(phoneNumber);ui->DormitoryLineEdit->setText(dormitory);ui->classLineEdit->setText(className);ui->DepartmentLineEdit->setText(department);ui->InstructorLineEdit->setText(instructor);ui->InstructorPhoneNumberLineEdit->setText(instructorPhone);Notfond=false;InfoNotAll=false;}if(InfoNotAll){QString sqlByName2=QString("select student.id,student.name,student.sex,student.age,student.address,student.phone_number,student.dormitory from student where student.name='%1'").arg(findName);query2.exec(sqlByName2);while (query2.next()) {QString id=query2.value(0).toString();QString name=query2.value(1).toString();QString sex=query2.value(2).toString();QString age=query2.value(3).toString();QString address=query2.value(4).toString();QString phoneNumber=query2.value(5).toString();QString dormitory=query2.value(6).toString();//下面为查到的信息ui->IdLineEdit->setText(id);ui->NameLineEdit->setText(name);ui->SexLineEdit->setText(sex);ui->AgeLineEdit->setText(age);ui->AddressLineEdit->setText(address);ui->PhoneNumberLineEdit->setText(phoneNumber);ui->DormitoryLineEdit->setText(dormitory);ui->classLineEdit->setText("null");ui->DepartmentLineEdit->setText("null");ui->InstructorLineEdit->setText("null");ui->InstructorPhoneNumberLineEdit->setText("null");Notfond=false;}}if(Notfond){QMessageBox::information(this, "警告", "未找到相关信息");this->close();admin_find_show *adminFindShow=new admin_find_show;adminFindShow->show();}}}

6.此外,受之前科学计算器的启发,增加了复制tableview信息的功能,比如要删除某学号,点一下相对应的学号,就会弹出已复制的提示,到删除学号框或查找框就能进行粘贴。这是提高用户体验感的一种做法。具体实现代码如下:

//选中tableview,获取选中的内容
void admin_student_show::on_tableView_clicked(const QModelIndex &index)
{QString tableViewValue=index.data().toString();QClipboard *board=QApplication::clipboard();board->setText(tableViewValue);QMessageBox::information(this, "温馨提示", "信息"+tableViewValue+"已复制到粘贴板");
}

四.总结

整个学生信息管理系统来说,原理比较简单,也比较好实现,但是由于Qt连接sqlite数据库没有学过,所以我查阅了很多教程,花了比较多时间整理思路。整个程序给我的感觉就是满足实用性。
打包后可执行文件,需要的同学可以点击下载

QT大作业之---学生信息管理系统相关推荐

  1. QT大作业:学生管理系统(通过mysql数据库)

    一.前言 学校实验室进行第二轮考核,第二次qt作业是学生管理系统. 要求如下: 1.连接数据库,对学生信息进行增删改查操作,可以使用qt的SQLITE,但大家需自行学习sql语句的语法才能实现相关功能 ...

  2. android大作业之---图书信息管理系统

    江南有丹橘,经冬犹绿林. 岂伊地气暖?自有岁寒心. 可以荐嘉客,奈何阻重深. 运命惟所遇,循环不可寻. 徒言树桃李,此木岂无阴? -张九龄<感遇> 一.实现的效果如下图. (1)登录界面图 ...

  3. C++大作业--班级同学信息管理系统

    在这个学期,老师布置了C++课程程序设计报告 题目如下: 所设计的班级同学信息管理系统应具有以下功能: 1.登录功能:登录该系统时需要输入登录密码,默认的密码是666,可修改登录密码. 2.数据输入功 ...

  4. 大学C语言系统作业,c语言大作业_学生成绩管理系统v5.0.doc

    Word格式 完美整理 //成绩管理系统v1.0 #include #include #include #define N 30 #define M 6 typedef struct student ...

  5. c语言学生信息管理系统(巨简单)

    偶然翻看自己的优盘,看到了自己一年前写的一个大一时候的大作业,学生信息管理系统,决定分享出来,为大家做一个参考.接下来就是代码了.以下代码只包含了增删查改排序统计的功能.希望对大家有所帮助. #inc ...

  6. jsp 按照学号查找学生_JSPServlet牛刀小试:学生信息管理系统

    小弟这学期的JSP&JAVA SERVLET课程上完了,课程作业是学生信息管理系统,在开发过程遇到了许多问题,记录下来,作为自己学习的总结,也可以给大家作为参考.如果有错误的地方,多多包涵. ...

  7. Linux学生QT成绩查询系统大作业报告,GitHub - cxc1357/Student-Information-Manage-System: QT实现的学生信息管理系统,高程大作业...

    学生信息管理系统 一.系统指南 本系统为表格式的学生信息管理系统,提供了文件新建.打开及保存功能,还可在表格中对数据进行增加.删除.修改.搜索,下面将一一介绍这些功能 1.新建文件 新建文件将会产生一 ...

  8. 学委作业管理系统c语言,c语言大作业-学生信息管理系统.doc

    c语言大作业-学生信息管理系统.doc 课程设计报告书 题目:学生信息管理系统设计 学 院 电子与信息学院 专 业 电子信息类 学生姓名 学生学号 指导教师 课程编号 135160 课程学分 1学分 ...

  9. 基于JavaSwing开发学生信息管理系统(SQLServer数据库版本) 毕业设计 课程设计 大作业

    基于JavaSwing开发学生信息管理系统(SQLServer数据库版本):   (大作业) 开发环境: Windows操作系统 开发工具: MyEclipse+Jdk+SQLServer数据库 运行 ...

最新文章

  1. linux scp移动文件夹,linux scp远程拷贝文件及文件夹
  2. mysql中迅速插入百万条测试数据的方法
  3. 【转】使用Chrome Frame,彻底解决浏览器兼容问题
  4. 面向云数据库,超低延迟文件系统PolarFS诞生了
  5. 关于invSqrt( )函数
  6. Linux make menuconfig查找并快速跳转指定驱动选项
  7. 问题 D: Search Problem
  8. [HDU3683 Gomoku]
  9. httpclient之get/post
  10. css如何设置div中的内容垂直居中?
  11. mysql sql查询当天_sql查询当天数据
  12. 互联网日报 | 腾讯地图全国上线聚合打车服务;国庆档首日票房突破7亿;特斯拉国产Model3再降价...
  13. 【VS】错误1error LNK1168: 无法打开 F:\C++6\prob\ConsoleApplication1\Debug\ConsoleApplication1.exe 进行写入
  14. linux设备驱动模型大剖析(1)-----底层阶级的程序猿
  15. Wincc RT Professional第一讲-组态
  16. 华为交换机主备命令_华为交换机命令汇总
  17. 打印时候复选框勾选不见了_使用JS实现分页打印(复选框勾选打印)
  18. java中一行代码实现百分数计算
  19. [GitHub] JavaScript 趋势榜项目(第30周)
  20. 网工解惑,子网掩码是什么以及子网掩码有哪些?

热门文章

  1. 一篇文章玩转 RNN 网络 原理
  2. item2 + oh-my-zsh
  3. 《后会无期》为何将电影老炮甩身后
  4. QuartusII开发软件中的宏模块
  5. 专业专注、以客户为中心-是我们的服务理念
  6. 如何使用HTTPS加密保护网站?
  7. iOS开发支付 — 内购(IAP)
  8. 快速把照片做成MV,用什么软件好?抖音火爆效果制作
  9. vue 生命周期的详解
  10. 傻瓜交换机带来的问题