QT大作业之---学生信息管理系统

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

一.总体分析

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

二.实现效果图

(1)管理员主要功能截图
QT大作业之---学生信息管理系统_第1张图片
QT大作业之---学生信息管理系统_第2张图片
QT大作业之---学生信息管理系统_第3张图片
QT大作业之---学生信息管理系统_第4张图片
QT大作业之---学生信息管理系统_第5张图片
QT大作业之---学生信息管理系统_第6张图片
QT大作业之---学生信息管理系统_第7张图片

(2)学生主要功能截图
QT大作业之---学生信息管理系统_第8张图片

三.软件代码分析

这个学生信息管理系统主要实现用qt布局和设计,增删改查数据库,所以主要的代码其实是数据库的代码。Qt连接Sqiite数据库虽然不像mysql那样需要安装驱动,但是要在如下图所示的文件中加上sql。
QT大作业之---学生信息管理系统_第9张图片
(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");//指定SQLite
    db.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编程)