当前位置: 首页 > news >正文

基于QT(C++)实现(图形界面)选课管理系统

选课管理系统

1  概述

1.1  课程设计目的和意义

根据课程大纲设定,面向对象课程设计的目的是:

(1)理解面向对象的基本思想和三大机制,掌握基于 C++ 语法的面向对象的基 本概念和开发模式,熟练运用面向对象思维模式对信息和通信领域的软件系统问题进 行建模(对应毕业要求指标点 1.2)。

(2)掌握面向对象的程序设计方法和技术,具备以面向对象程序设计模式对开 发需求进行分析、设计和调试的能力(对应毕业要求指标点 3.1)。

(3)熟练运用基于 C++ 的面向对象开发环境,为后续其他面向对象编程环境做 好铺垫,针对实际需求充分利用现有开发工具的优势和特点解决具体问题,具备对工 具的选择和应用的能力(对应毕业要求指标点 5.1)。

1.2  课程设计内容

大一已经过了一半,每次开学或者学期末时候,所有同学都要订下本学期或者下 一学期该学的课程内容,因此根据自己了解的场景,完成本学期课程设计:教务选课 系统,系统开发内容可以按照以下模式进行:

(1)参考学校教务网功能模拟开发选课子系统,要完成基本信息类和业务类的 封装(包括必要的构造函数析构函数和返回信息等成员)。编写相应的测试程序对类进 行测试。

(2)编写相应的管理类。管理功能包括对象的文件存储、对象的获取(构造)、 基本统计和分析等。编写相应的测试程序对管理类进行测试。

(3)可以将管理类的编写分阶段进行。从学生管理类、课程管理类,最后再编 写综合管理类。

(4)所有的处理尽可能地封装在类成员中。测试主函数和运行主函数尽量简 单。少用或不用主函数以外的外部函数。

(5)数据文件可以复制教务网上的数据文件或者建立对应的文本文件保存基本 信息类的对象内容,减少甚至杜绝使用 cin 和 cout,改用文件流操作数据。以便为后 续升级做准备。(调试时除外)

1.3  课程设计要求

课程设计要求每位同学独立完成具有一定完整性和实用性的面向对象程序。完整 体现面向对象三大机制(封装、继承、多态的)综合应用。//接口类,多态

(1)根据个人能力独立完成或分组完成。

(2)课程设计并非一天能够完成,需做好中间过程的保存和持续进行的工作。

2 系统需求设计

2.1  系统目标

实现教务系统选课模块的相关功能,具体如下:

(1)基本信息管理模块:基本信息(学生类、教师类、课程类)的增删查改以及在 界面中的显示、排序、查找

(2)选课模块:包含选课和退课两大功能(包含冲突检测)

(3)排课模块:教师提交课程、管理员添加课程

(4)实现数据以文件的形式读取和写入

(5)包含图形界面,界面友好

2.2  系统主要模块流程

2.2.1 学生选课、退课

2.2.2 教师提交课程、管理员审核

2.2.3 管理员相关功能

2.2.4 修改密码

2.3 系统类分析图

2.3.1 继承关系

(简略版)

由 management 基类派生出学生管理类、教师管理类、管理员管理类,这些管理类里 面都是纯虚函数,提供接口。管理员类、学生类、教师类分别由各自的管理类和 personInfo 类派生而来。管理类的方法在此实例化。下图为展开图。

(展开版)
2.3.2 其他类

前九个类是 qt 界面类。couseInfo(课程)类储存有课程的基本信息,并包含一些操作 方法。fileOperator(文件操作)类提供一些文件操作的方法,与管理类是组合关系。 modelSet(界面设置)类提供对 QStandardItemModel 对象的操作方法,包含排序和显 示等方法,与管理类是组合关系。

2.4 系统开发环境

系统开发软件:QT 5.7,采用了 QT Widget 框架完成界面设计及开发 文件模式:CSV

3   系统详细设计

3.1  系统主要功能

3.1.1 学生

(1)查看个人信息 通过点击按钮,表格中会显示学生的姓名、学号、年级、班级、专业、所选课程编号 等信息。

(2)查看已选课程、全校课程

通过点击按钮,表格中会显示已选课程/全校课程的选课代码、课程代码、课程名称、 教学班号、学分、性质、开课学院、教师、教师职称、时间、校区、最大容量、已选 人数等信息,且双击表头可进行排序(升/降序)。

(3)修改密码

输入新旧密码,点击确认,系统会将其与正确密码做比对,若不正确,则提示重新输 入,若正确,且长度大于六位,则用新密码替换旧密码。

(4)选课、退课 先在表格中点选相应课程,再点选相应按钮,选课(系统判断是否与已选课程冲突, 若冲突则提示选课冲突,若不是,则在已选课程中加入该课程),退课(提示是否退 课,若同意,则从已选课程中删除该课程)。

3.1.2 管理员

(1)查看全校学生、教师、课程信息 通过点击按钮,表格中会显示全校学生/教师/课程的详细信息,且双击表头可进行排 序(升/降序)。

(2)修改全校学生、教师、课程信息 先在表格中点选相应课程,再点选相应按钮,打开相应的修改窗口,加载选中的信 息,管理员对其进行修改,点击确认后,用修改后的信息替换原信息。

(3)添加全校学生、教师、课程信息 通过点击按钮,打开相应的窗口,管理员输入相关信息,点击确认后,在原有信息后 追加新信息。

(4)删除全校学生、教师、课程信息 先在表格中点选相应课程,再点选相应按钮,提示是否删除,若是则删除该信息,若 否,则不删除。

(5)处理教师开课需求 点击相应按钮,表格中显示相应的课程,若同意开课,则补充相应的课程代码、选课 编号、教学班号等,点击确定之后,将该课程添加到全校课程中。若不同意,则点击 拒绝请求,系统将删除相关的信息。若取消,则不做任何修改。

(6)修改密码 输入新旧密码,点击确认,系统会将其与正确密码做比对,若不正确,则提示重新输 入,若正确,且长度大于六位,则用新密码替换旧密码。

3.1.3 教师

(1)查看个人信息 通过点击按钮,表格中会显示教师的详细信息。

(2)查看所授课程

通过点击按钮,表格中会显示所授课程的选课代码、课程代码、课程名称、教学班 号、学分、性质、开课学院、教师、教师职称、时间、校区、最大容量、已选人数等 信息,且双击表头可进行排序(升/降序)。

(3)查看所授课程选课学生

先在表格中点选相应课程,再点选相应按钮,可以查看选择该课程的学生的详细信 息。

(4)提交课程 通过点击按钮,打开相应的窗口,教师输入相关信息,点击确认后,在待添加课程的 信息后追加新信息,供管理员审核。

(5)修改密码 输入新旧密码,点击确认,系统会将其与正确密码做比对,若不正确,则提示重新输 入,若正确,且长度大于六位,则用新密码替换旧密码。

3.2 系统设计中类图

管理类、学生管理类、学生类:继承关系 管理类、教师管理类、教师类:继承关系 管理类、管理员管理类、管理员类:继承关系 人信息类、学生类:继承关系 人信息类、教师类:继承关系 人信息类、管理员类:继承关系 管理员类、课程类:组合关系 管理员类、学生类:组合关系 管理员类、教师类:组合关系 教师类、学生类:组合关系 教师类、课程类:组合关系 学生类、课程类:组合关系

管理类、界面设置类:组合关系 管理类、文件操作类:组合关系 学生类、课程类:组合关系 教师类、课程类:组合关系 管理员类、课程类:组合关系

3.3 系统主要的数据结构及说明

3.3.1 学生类定义及说明
# ifndef INFOSTUDENT_H
# define INFOSTUDENT_H
# include <QString>
# include <QStringList>
# include <QStandardItemModel>
# include "infoperson.h"
# include "fileoperator.h"
# include "modelset.h"
# include "managementstudent.h"
# include "infocourse.h"
# include <QList>
# include <QDebug>
class studentInfo:public personInfo,public studentManagement
{
public:
//构造
studentInfo();;
//设置信息
void setInfo(QString name,QString id,QString grade,QString stuclass,QString college,QString major,QString password,QStringList course);
//加载相关信息
void loadAboutInfo();
//返回学院
QString getCollege() const;
//返回选课代码
QStringList getSelectedCourse() const;
//返回学生的基本信息
QStringList getAllInfo() const;
//派生类返回派生类对象指针
virtual studentInfo* next();//学生管理类实例化//添加课程选课代码到学生信息中
virtual void addCourse(QString id);
//移除学生信息中的选课代码
virtual void removeCourse(QString id);
//选课
virtual bool selectCourse(QString courseSelectId,QString courseName,QString courseTime);
//退课
virtual bool giveUpCourse(QString courseSelectId);
//查看所有课程
virtual void checkAllCourse(QStandardItemModel *model);
//查看我的课程
virtual void checkMyCourse(QStandardItemModel *model);
//查看我的信息
virtual void checkMyInfo(QStandardItemModel *model,int curRow) const;
//修改密码
virtual bool modifyPassword(QString oldPassword,QString newPassword);
//保存当前的信息到文件中
virtual void saveAllInfo();
//以选课编号匹配课程
virtual courseInfo& matchCourseWithId(const QString courseSelectId,QVector<courseInfo> &course);private:
QString stuGrade;//增加学生类年级信息QString stuClass;//增加学生类班级信息QString stuCollege;//增加学生类学院信息QString stuMajor;//增加学生类专业信息QString stuPassword;//增加学生类密码信息QStringList stuCourse;//增加学生类已选课程信息QVector<courseInfo> allCourse;QList<courseInfo> myCourse;};# endif // INFOSTUDENT_H
3.3.2 教师类定义及说明
# ifndef INFOTEACHER_H
# define INFOTEACHER_H# include <QString>
# include <QStringList>
# include <QVector>
# include <QList>
# include <QDebug>
# include "infoperson.h"
# include "managementteacher.h"
# include "infostudent.h"
# include "infocourse.h"
class teacherInfo:public personInfo,public teacherManagement
{
public:
teacherInfo();void setInfo(QString name,QString id,QString password,QString college,QString level,QStringList course);
//加载相关信息
void loadInfo();
//查看相应课程的学生
bool loadMyStudent(QString selectId);
//返回选课代码
QStringList getMyCourse();
//返回所有信息
QStringList getAllInfo() const;
//返回学院
QString getCollege();
//返回职称
QString getLevel();//查看我的学生
virtual void checkMyStudent(QStandardItemModel *model);
//查看我的课程
virtual void checkMyCourse(QStandardItemModel *model);
//修改密码
virtual bool modifyPassword(QString oldPassword,QString newPassword);
//查看我的信息
virtual void checkMyInfo(QStandardItemModel *model,int curRow) const;
//添加选课编号到我的信息中
virtual void addCourse(QString id);
//从我的信息中移除选课编号
virtual void removeCourse(QString id);
//提交课程
virtual void submitCourse(courseInfo &course);
//以选课编号匹配课程
virtual courseInfo& matchCourseWithId(const QString courseSelectId,QVector<courseInfo> &course);
//保存所有信息
virtual void saveAllInfo();private:
QString teaCollege;
QString teaLevel;
QString teaPassword;
QStringList teaCourse;
QVector<studentInfo> myStudent;
QVector<studentInfo> allStudent;
QVector<courseInfo> myCourse;
QVector<courseInfo> allCourse;
QList<courseInfo> waitToLoadCourse;};# endif // INFOTEACHER_H
3.3.3 课程类定义及说明
# ifndef INFOCOURSE_H
# define INFOCOURSE_H
# include <QString>
# include <QStringList>
# include <QStandardItemModel>
class courseInfo
{
public:
courseInfo();
//获取选课代码
QString getCourseSelectId() const;
//获得课程名称
QString getCourseName() const;
//获得课程时间
QString getCourseTime() const;
//设置课程信息
void setCourseInfo(QString courseSelectId,QString courseId,QString courseName,QString courseClass,QString courseCredit,QString courseCharacter,QString courseCollege,QString courseTeacherName,QString courseTeacherLevel,QString courseTime,QString courseAddress,QString courseMaxStudent,QString courseCurrentStudent);
//把课程显示到tableView中
void displayThisCourse(QStandardItemModel *model,int curRow) const;
//学生选课时,人数加一
void peoplePlusOne();
//学生退课时,人数减一
void peopleMinOne();
//获取课程信息,生成一个QStringList类型的数据
QStringList getAllInfo() const;
private:
QString courseSelectId;
QString courseId;
QString courseName;
QString courseClass;
QString courseCredit;
QString courseCharacter;
QString courseCollege;
QString courseTeacherName;
QString courseTeacherLevel;
QString courseTime;
QString courseAddress;
QString courseMaxStudent;
QString courseCurrentStudent;
};# endif // INFOCOURSE_H
3.3.4 管理员类定义及说明
# ifndef INFOADMIN_H
# define INFOADMIN_H
# include <QVector>
# include "infoperson.h"
# include "managementadmin.h"
# include "infostudent.h"
# include "infoteacher.h"
# include "infocourse.h"
class adminInfo:public personInfo,public adminManagement
{
public:
adminInfo();
//已实现
void setInfo(QString name,QString id,QString password);int whoAreYou(QString id);QList<courseInfo>& getWaitToLoadCourse();QStringList getAllInfo();
//实例化接口//把相关信息显示到表格
virtual void displayAllStudent(QStandardItemModel *model);virtual void displayAllTeacher(QStandardItemModel *model);virtual void displayAllCourse(QStandardItemModel *model);virtual void checkMyInfo(QStandardItemModel *model);virtual bool displayCourseWithId(const QString& id,QStandardItemModel *model);virtual bool displayCourseWithName(const QString& name,QStandardItemModel *model);virtual bool displayTeacherWithId(const QString& id,QStandardItemModel *model);virtual bool displayTeacherWithName(const QString& name,QStandardItemModel *model);virtual bool displayStudentWithId(const QString& id,QStandardItemModel *model);virtual bool displayStudentWithName(const QString& name,QStandardItemModel *model);virtual void displayWaitToLoadCourse(QStandardItemModel *model);//添加相关信息
virtual void addNewCourse(courseInfo& newCourse);virtual void addNewStudent(studentInfo& newStudent);virtual void addNewTeacher(teacherInfo& newTeacher);//修改密码
virtual bool modifyPassword(QString oldPassword,QString newPassword);//修改相关信息
virtual void modifyStudentInfo(studentInfo& info,QStringList newInfo);virtual void modifyCourseInfo(courseInfo& info,QStringList newInfo);virtual void modifyTeacherInfo(teacherInfo& info,QStringList newInfo);//删除相关信息
virtual void deleteStudentInfo(QString id);virtual void deleteTeacherInfo(QString id);virtual void deleteCourseInfo(QString id);//查找相关信息
virtual teacherInfo& findTeacherWithId(const QString& id);virtual teacherInfo& findTeacherWithName(const QString& name);virtual studentInfo& findStudentWithId(const QString& id);virtual studentInfo& findStudentWithName(const QString& name);virtual courseInfo& findCourseWithId(const QString &id);//保存文件
virtual void saveAllInfo();private:
QList<studentInfo> stuInfo;
QList<teacherInfo> teaInfo;
QList<courseInfo> couInfo;
QList<courseInfo> waitToLoadCourse;
QString adminPassword;};# endif // INFOADMIN_H
3.3.5 文件操作类定义及说明
# ifndef FILEOPERATOR_H
# define FILEOPERATOR_H
# include <QString>
# include <QStringList>class fileOperator
{
public:
fileOperator();
//读取信息文件
bool readFromInfoFile(QString address,QStringList& _line);
//写入信息文件_temp
bool writeInfoToFile(QString address,const QStringList& _line);
//替换文件
bool replaceFile(QString address1,QString address2);
//修改文件中与_line不同的条目
bool modifyFile(QString address,const QStringList& _line);
//在文件最后添加_line
bool appendToFile(QString address,const QStringList& _line);
};# endif // FILEOPERATOR_H
3.3.6 界面设置类定义及说明
# ifndef MODELSET_H
# define MODELSET_H# include <QStandardItemModel>
# include <QString>
# include <QStringList>class modelSet
{
public:
modelSet();
//设置课程表头
void setCourseTitle(QStandardItemModel *model);
//设置学生信息表头
void setStudentTitle(QStandardItemModel *model);
//设置教师信息表头
void setTeacherTitle(QStandardItemModel *model);
//设置课程条目
void setCourseItem(QStandardItemModel *model,const QStringList& _linesplit,const int& currow);
//设置学生条目
void setStudentItem(QStandardItemModel *model,const QStringList& _linesplit,const int& currow);
//设置老师条目
void setTeacherItem(QStandardItemModel *model,const QStringList& _linesplit,const int& currow);//以下为排序相关函数
void quickSort(int p, int q,int column,QStandardItemModel *model);void quickSort_1(int p, int q,int column,QStandardItemModel *model);void Swap(int p1,int p2,QStandardItemModel *model);int partition(int p, int q, int column,QStandardItemModel *model);
};# endif // MODELSET_H

3.4  继承机制实现

由 management 基类派生出 studentManagement 学生管理类、teacherManagement 教师 管理类、adminManagement 管理员管理类,这些管理类里面是纯虚函数,提供方法接 口,具体在管理员类、学生类、教师类中实现。adminInfo 管理员类、studentInfo 学生 类、teacherInfo 教师类分别由各自的管理类和 personInfo 类派生而来。具体见类图。

3.5  多态机制实现

学生管理类、教师管理类、管理员管理类之间可以形成多态。他们具有共同的特点--- 修改密码、储存信息到文件中等。因此利用纯虚函数,为学生类、教师类、管理员类 提供接口,形成多态。另外,本系统的采用接口与实现分离的设计模式,使用虚函数 等,也可形成多态。

3.6 主要采用的算法

3.6.1 排序算法

使用快速排序算法对 QStandardItemModel 类对象进行排序,具体如下:

void modelSet::Swap( int p1, int p2, QStandardItemModel *model )
{for ( int i = 0; i < model->columnCount(); i++ ){QStandardItem* t1 = NULL; QStandardItem* t2 = NULL; if ( model->item( p1, i ) != NULL )t1 = model->item( p1, i )->clone();if ( model->item( p2, i ) != NULL )t2 = model->item( p2, i )->clone();model->setItem( p1, i, t2 );model->setItem( p2, i, t1 );}
}int modelSet::partition( int p, int q, int column, QStandardItemModel *model )
{QString pivot = model->item( q, column )->text(); int i = p - 1;for ( int j = p; j <= q - 1; j++ ){if ( model->item( j, column )->text() <= pivot ){i++;Swap( j, i, model );}else if ( !(model->item( j, column )->text() >= pivot) ){i++;Swap( j, i, model );}}Swap( q, i + 1, model ); return(i + 1);
}/* 以下分别为升降序 */
void modelSet::quickSort( int p, int q, int column, QStandardItemModel *model )
{if ( p < q ){int r = partition( p, q, column, model ); quickSort( p, r - 1, column, model ); quickSort( r + 1, q, column, model );}
}void modelSet::quickSort_1( int p, int q, int column, QStandardItemModel *model )
{quickSort( p, q, column, model );for ( int i = 0; i < model->rowCount() / 2; i++ ){Swap( i, model->rowCount() - 1 - i, model );}
}
3.6.2 查找算法
(1)返回值为 bool 类型(用于界面类的查询)
void adminMenu::on_btn_confirm_clicked()
{QString edit = this->ui->edit_check->text();  int flag = this->ui->box_select->currentIndex();switch ( flag ){case 0:if ( !admInfo->displayStudentWithName( edit, model ) )QMessageBox::critical( this, "错误", "未找到!请检查!", "确认" );break; case 1:if ( !admInfo->displayStudentWithId( edit, model ) )QMessageBox::critical( this, "错误", "未找到!请检查!", "确认" );break; case 2:if ( !admInfo->displayTeacherWithName( edit, model ) )QMessageBox::critical( this, "错误", "未找到!请检查!", "确认" );break; case 3:if ( !admInfo->displayTeacherWithId( edit, model ) )QMessageBox::critical( this, "错误", "未找到!请检查!", "确认" );break; case 4:if ( !admInfo->displayCourseWithId( edit, model ) )QMessageBox::critical( this, "错误", "未找到!请检查!", "确认" );break; case 5:if ( !admInfo->displayCourseWithName( edit, model ) )QMessageBox::critical( this, "错误", "未找到!请检查!", "确认" );break;}
}bool adminInfo::displayCourseWithId( const QString &id, QStandardItemModel *model )
{int j = 0;for ( int i = 0; i < couInfo.length(); i++ ){if ( couInfo.at( i ).getCourseSelectId() == id ){couInfo.at( i ).displayThisCourse( model, j++ );}}return(j);
}bool adminInfo::displayCourseWithName( const QString &name, QStandardItemModel *model )
{int j = 0;for ( int i = 0; i < couInfo.length(); i++ ){if ( couInfo.at( i ).getCourseName() == name ){couInfo.at( i ).displayThisCourse( model, j++ );}}return(j);
}bool adminInfo::displayTeacherWithId( const QString &id, QStandardItemModel *model )
{int j = 0;for ( int i = 0; i < teaInfo.length(); i++ ){if ( teaInfo.at( i ).getId() == id ){teaInfo.at( i ).checkMyInfo( model, j++ );}}return(j);
}bool adminInfo::displayTeacherWithName( const QString &name, QStandardItemModel *model )
{int j = 0;for ( int i = 0; i < teaInfo.length(); i++ ){if ( teaInfo.at( i ).getName() == name ){teaInfo.at( i ).checkMyInfo( model, j++ );}}return(j);
}bool adminInfo::displayStudentWithId( const QString &id, QStandardItemModel *model )
{int j = 0;for ( int i = 0; i < stuInfo.length(); i++ ){if ( stuInfo.at( i ).getId() == id ){stuInfo.at( i ).checkMyInfo( model, j++ );}}return(j);
}bool adminInfo::displayStudentWithName( const QString &name, QStandardItemModel *model )
{int j = 0;for ( int i = 0; i < stuInfo.length(); i++ ){if ( stuInfo.at( i ).getName() == name ){stuInfo.at( i ).checkMyInfo( model, j++ );}}return(j);
}
(2)返回值为对象的引用(方便被其他函数调用)
teacherInfo &adminInfo::findTeacherWithId( const QString &id )
{for ( int i = 0; i < teaInfo.length(); i++ ){if ( teaInfo.at( i ).getId() == id ){return(teaInfo[i]);}}
}teacherInfo &adminInfo::findTeacherWithName( const QString &name )
{for ( int i = 0; i < teaInfo.length(); i++ ){if ( teaInfo.at( i ).getName() == name ){return(teaInfo[i]);}}
}studentInfo &adminInfo::findStudentWithId( const QString &id )
{for ( int i = 0; i < stuInfo.length(); i++ ){if ( stuInfo.at( i ).getId() == id ){return(stuInfo[i]);}}
}studentInfo &adminInfo::findStudentWithName( const QString &name )
{for ( int i = 0; i < stuInfo.length(); i++ ){if ( stuInfo.at( i ).getName() == name ){return(stuInfo[i]);}}
}courseInfo &adminInfo::findCourseWithId( const QString &id )
{for ( int i = 0; i < couInfo.length(); i++ ){if ( couInfo.at( i ).getCourseSelectId() == id ){return(couInfo[i]);}}
}
3.6.3 冲突检测算法
bool studentInfo: :selectCourse(QString courseSelectId, QString courseName, QString courseTime) {for (int i = 0; i < myCourse.length(); i++) {if (myCourse.at(i).getCourseSelectId() == courseSelectId || myCourse.at(i).getCourseTime() == cou rseTime || myCourse.at(i).getCourseName() == courseName) {return (false);}}matchCourseWithId(courseSelectId, allCourse).peoplePlusOne();addCourse(courseSelectId);myCourse.push_back(matchCourseWithId(courseSelectId, allCourse));return (true);
}

3.7 文件结构

3.7.1 courseInfo.csv 文件

课程文件的文件结构

选课代码 课程代码 课程名称 教学班号 学分 性质 开课学院 教师 教师职称 时间 校区 最大容量 已选人数

3.7.2 adminInfo.csv 文件

管理员文件的结构 用户名 账号 密码

3.7.3 stuInfo.csv 文件

学生文件的结构

姓名 学号 密码 年级 班级 学院 专业 所选课程选课代码

3.7.4 teacherInfo.csv 文件

教师文件的结构

姓名 工号 密码 学院 职称 所授课程选课代码

3.7.5 waitToLoadCourse.csv 文件

开课需求文件的结构

选课代码(空) 课程代码(空) 课程名称 教学班号(空) 学分 性质 开课学院 教师 教师职称 时间 校区 最大容量 已选人数

4 系统主要功能界面

4.1  登陆界面

4.1.1 主界面

程序的入口,提供三种角色选择(学生、教师、管理员),输入账号、密码,程序会将 其与文件中保存的账号和密码进行匹配,从而实现登陆。

若未选择角色,则会弹出以下提示:

若用户名或密码错误,则会弹出以下提示:

4.2  学生菜单

4.2.1 主界面

若选择学生角色,登陆成功后,会跳转到以下界面,通过点击按钮可实现相应功能。

4.2.2 查看个人信息

TableView 中显示该学生的信息

4.2.3 查看所有课程

4.2.4 查看已选课程

4.2.5 选课

若未选中课程,提示:

若不存在冲突,则将其添加到已选课程中,并提示:

若上课时间冲突或者已选择相同课程或者同名课程,则提示“选课冲突”:

4.2.6 退课

提示退课成功:

4.2.7 修改密码

若旧密码输入正确:

若旧密码输入错误,或新密码不足六位

4.2.8 退出系统

点击退出系统后,所有修改会保存在文件,窗口关闭

4.3  教师菜单

4.3.1 主界面

若选择教师角色,登陆成功后,会跳转到以下界面,通过点击按钮可实现相应功能。

4.3.2 查看个人信息

4.3.3 查看所授课程信息

4.3.4 查看选择该课程的学生

4.3.5 提交新的课程

4.3.6 修改密码

4.3.7 退出系统

点击退出系统后,所有修改会保存在文件,窗口关闭

4.4  管理员菜单

4.4.1 主界面

4.4.2 查看全校学生信息

4.4.3 查看全校课程信息

4.4.4 查看全校教师信息

4.4.5 查看老师开课需求

4.4.6 添加学生信息

4.4.7 添加课程信息

4.4.8 添加教师信息

4.4.9 修改学生信息

4.4.10 修改课程信息

4.4.11 修改教师信息

4.4.12 删除信息

4.4.13 查询信息

4.4.14 修改密码

4.4.15 退出系统

点击退出系统后,所有修改会保存在文件,窗口关闭

5 学习总结

本次的课程设计让我将课堂中学到的面向对象程序设计的思想运用到了实际的项 目中,并且学到了 Qt 界面编程的相关知识,了解了 MVC 设计模式、信号与槽机制, 提高了 debug 能力。 从最初拿到这份作业不知道如何下手,感觉对 Qt 一窍不通,差一点就选择了使用控制台的模式完成,但到在老师的指导下,我初步的掌握到了 Qt 编程的一些基本 思路和方法,再到通过网上查询的相关资料,阅读他人写的文章,寻找相关书籍中的 特定知识点等等方式让我对 Qt 不再胆怯,最终选择 Qt 完成了本次的作业。在这个过 程中,我的信息检索能力和自学能力得到了大大的提升。

这次的作业还让我切身体会到一个系统的设计与实现过程,在编写程序的过程中我走过很多弯路,不断试错,好歹纠正了过来。我认为编程中最重要的一点便是需要 有一个整体设计的大局观,不能只想着此时所编写的这一小块,要从各种方面进行综 合考虑,不能顾此失彼。

不要一开始就胆怯害怕,千里之行始于足下。当迈出了第一步之后,会发现问题 往往并没有你想象的那么难。学习编程时,要学会查文档、查资料、借鉴他人优秀的 思路,自学能力十分重要,要善于去课外扩充自己的知识,提高自己的技术,不能只局限于短短的课堂时间。

http://www.lryc.cn/news/598417.html

相关文章:

  • 网易大模型算法面经总结第一篇
  • 【News】同为科技亮相首届气象经济博览会
  • Qt 元对象系统(Meta-Object System)解析
  • 【C#补全计划:类和对象(六)】
  • 【Linux基础知识系列】第六十三篇 - 文件编辑器基础:vim
  • Windows11 本地安装docker Desktop 部署dify 拉取镜像报错
  • 告别下载中断:深入解析Tomcat JSP中的“远程主机强迫关闭连接”与“软件中止连接”
  • BI 系统数据看板全解析:让数据可视化驱动业务决策
  • k8s之ingress定义https访问方式
  • 使用Claude Code从零到一打造一个现代化的GitHub Star项目管理器
  • QT项目-仿QQ音乐的音乐播放器(第二节)
  • 【初识数据结构】CS61B 中的归并排序和选择排序
  • [网安工具] 自动化威胁检测工具 —— D 盾 · 使用手册
  • kubernetes集群中部署CoreDNS服务
  • OceanBase 4.3.5 解析:DDL性能诊断
  • 爆肝整理,性能测试详细汇总,从0到1打通(二)
  • 基于深度学习的胸部 X 光图像肺炎分类系统(三)
  • 在 OceanBase 中,使用 TO_CHAR 函数 直接转换日期格式,简洁高效的解决方案
  • 深入理解 eMMC RPMB 与 OP-TEE 在 Linux 系统中的应用开发
  • 使用宝塔面板搭建 PHP 环境开发一个简单的 PHP 例子
  • 解决VSCode无法加载Json架构问题
  • 《计算机网络》实验报告八 加密、数字签名与证书
  • 力扣844. 比较含退格的字符串
  • 借助Aspose.HTML控件,在 Python 中将 HTML 转换为 Markdown
  • 【bug解决】 esp32 在WSL-ubuntu20.04环境下找不到设备
  • MIT线性代数01_方程组的几何解释
  • 造成服务器内存不足的原因有什么
  • 飞腾D2000/E2000/D3000如何从头制作UBOOT引导系统镜像
  • Pycharm、Python安装及配置小白教程
  • 【docker | 部署 】Jetson Orin与AMD平台容器化部署概述