C++课程设计:学校人员信息管理系统(可视化界面)

本文主要是介绍C++课程设计:学校人员信息管理系统(可视化界面),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

学校人员信息管理系统

操作演示

MP4转GIF动图

设计功能要求

评分标准

QT Creator安装和新建项目

QT安装

QT新建项目

管理系统程序设计

mainwindow.h 文件

mainwindow.h 程序释义

mainwindow.cpp 文件

mainwindow.cpp 程序释义

main.h 文件

TXT文件生成


        博主最近面临SWUST的C++课设作业,我们是有3个题目选择的:电梯控制系统程序设计、学校人员信息管理系统和个人银行账户管理系统。本来想直接用上一届师兄的课设-----电梯控制系统程序设计,但看到题目要求说有可视化界面加大分,但是师兄的并未包含这个内容,所以就自己做一个吧,毕竟我也想要把分数搞高一点呀,哈哈!

但是在这里还是把师兄的课设放在这里供大家参考吧!

电梯控制系统程序设计(控制台):C++课程设计:电梯控制系统程序设计

学校人员信息管理系统

操作演示

OK啦,我们直接看下效果好吧

由于完整操作视频转为GIF图后较大,无法直接写入本博客,想要查看完整演示的可以看下面这个

QT学校人员管理系统

MP4转GIF动图

在这里也给大家安利一波MP4视频文件转GIF动图的方法吧,可以说是百试不爽啦

首先安装 moviepy

pip install moviepy

听说有时安装会报错,由于我之前把默认下载源改为清华镜像源的了,所以这里并未出现任何报错,如果大家有安装报错的也可以尝试用镜像源安装,如下:

pip install moviepy -i https://pypi.tuna.tsinghua.edu.cn/simple

接下来输入以下代码进行转换

from moviepy.editor import VideoFileClipdef convert_mp4_to_gif(input_file, output_file, fps=10):# 使用with语句确保clip在使用后自动关闭with VideoFileClip(input_file) as clip:# 将视频转换为GIFclip.write_gif(output_file, fps=fps)if __name__ =='__main__':input_file = "E:\Desktop\Qt.mp4" # 替换为你的MP4文件路径output_file = 'qt.gif'  # 输出的GIF文件路径convert_mp4_to_gif(input_file, output_file)

设计功能要求

(1)包括一个基本的人员信息类,人员信息有编号、姓名、性别、年龄等,允许用户进行以下操作:开户、销户、登陆;用户登陆后可以查看相关信息。

(2)人员管理管理系统包括教师学生两部分,学生又分本科生和研究生

(3)教师类在人员信息类基础上新增职称和部门等数据信息,新增功能:①输入并保存教师信息;②教师用户登陆后可以查看相关信息。

(4)学生用户登陆后可以查看各门课相关信息(包括成绩、在已输入学生中的成绩排名)。

(5)由教师类和学生类派生一个研究生类,新增研究方向和导师等数据信息,新增功能:①输入并保存信息;②研究生用户登陆后可以查看相关信息。

(6)将所有用户信息存于文件中。

评分标准

程序中有默认形参值的函数(+3);程序用到引用的知识(+3);程序中用到内联函数(+3);数据类型丰富(+1)。

正确定义类(+3);类中构造函数、析构函数完整(+5);数据访问属性明确(+2)。

各章知识综合应用,如第5章的静态数据、常数据(+3),指针正确使用(+2);第6章的动态创建数组或vector模板的应用(+5);第7章的继承与派生正确使用(+10),第8章的多态(+5),第11章的文件流等(+5)。

可视化方式实现,难度值加分(10~20分)

控制台实现,难度值加分(1~10分)

可以看到哈,可视化界面和控制台两种方式连打的基础分都不一样,所以可视化特别重要呀

QT Creator安装和新建项目

可视化界面的实现一定是离不开QT软件的呀,这里给大家简单介绍一下QT的安装和使用方法吧!

QT安装

下载地址:Index of/archive/qt/

官方地址:https://www.qt.io/download-open-source

这里我以官方地址为例,大家根据电脑配置选择合适的即可

QT的安装需要注册,大家按照安装流程正常操作即可

这里选择上面那个,接着一路下一步即可

由于我之前已经安装过QT软件,所以这里可能会继承我之前选择的一些内容,大家如果有步骤和上面不一样(或者需要选择组件的话),可以按照下面的组件选择

QT新建项目

创建项目 - > Application(Qt) - > Qt Widgets Application

这里的名称和路径都可以自定义

这里选择qmake

这里的名称可以自定义,注意:Generate form一定要勾选(不然后面运行会报错)

这里我只有一个组件,如果大家遇到有多个的话,直接全部勾选即可

最后会生成对应的 .h 、.cpp 以及 .ui 文件

管理系统程序设计

mainwindow.h 文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QStackedWidget>
#include <QLineEdit>
#include <QPushButton>
#include <QLabel>
#include <QVector>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE/***************************添加一个具有默认参数值的函数。使用引用。定义内联函数。添加静态数据和常数据。***************************/class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void showAccountCreation();void showAccountDeletion();void showLogin();void returnToMainMenu();void createTeacherAccount();void createUndergraduateAccount();void createGraduateAccount();void deleteAccount();void login();void showTeacherForm();void showUndergraduateForm();void showGraduateForm();void displayUserInfo(const QString& userInfo);void showWelcomeScreen();  // 新增的槽函数void exitApplication();    // 新增的槽函数private:Ui::MainWindow *ui;QStackedWidget *stackedWidget;QWidget *mainMenu;QWidget *accountCreationMenu;QWidget *teacherForm;QWidget *undergraduateForm;QWidget *graduateForm;QWidget *accountDeletionMenu;QWidget *loginMenu;QWidget *userInfoDisplay;QWidget *welcomeScreen;  // 新增的初始界面QLabel *welcomeLabel;QLabel *welcomeImage;QLineEdit *teacherIdInput;QLineEdit *teacherNameInput;QLineEdit *teacherGenderInput;QLineEdit *teacherAgeInput;QLineEdit *teacherTitleInput;QLineEdit *teacherDepartmentInput;QLineEdit *undergradIdInput;QLineEdit *undergradNameInput;QLineEdit *undergradGenderInput;QLineEdit *undergradAgeInput;QLineEdit *undergradMathInput;QLineEdit *undergradChineseInput;QLineEdit *undergradEnglishInput;QLineEdit *gradIdInput;QLineEdit *gradNameInput;QLineEdit *gradGenderInput;QLineEdit *gradAgeInput;QLineEdit *gradResearchDirectionInput;QLineEdit *gradAdvisorInput;QLineEdit *deleteIdInput;QLineEdit *deleteNameInput;QLineEdit *loginIdInput;QLineEdit *loginNameInput;QLabel *userInfoLabel;class Person {public:QString id;QString name;QString gender;int age;virtual QString getInfo() const = 0;virtual ~Person() = default;};class Teacher : public Person {public:QString title;QString department;QString getInfo() const override {return QString("教师编号: %1\n姓名: %2\n性别: %3\n年龄: %4\n职称: %5\n部门: %6").arg(id).arg(name).arg(gender).arg(age).arg(title).arg(department);}};class Student : public Person {public:int mathScore;int chineseScore;int englishScore;QString getInfo() const override {return QString("学生编号: %1\n姓名: %2\n性别: %3\n年龄: %4\n数学成绩: %5\n语文成绩: %6\n英语成绩: %7").arg(id).arg(name).arg(gender).arg(age).arg(mathScore).arg(chineseScore).arg(englishScore);}};class Graduate : public Person {public:QString researchDirection;QString advisor;QString getInfo() const override {return QString("研究生编号: %1\n姓名: %2\n性别: %3\n年龄: %4\n研究方向: %5\n导师: %6").arg(id).arg(name).arg(gender).arg(age).arg(researchDirection).arg(advisor);}};QVector<Person*> people;void setupMainMenu();void setupAccountCreationMenu();void setupTeacherForm();void setupUndergraduateForm();void setupGraduateForm();void setupAccountDeletionMenu();void setupLoginMenu();void setupUserInfoDisplay();void setupWelcomeScreen();  // 新增的设置初始界面函数void savePeopleInfoToFile(const QString &filename = "people_info.txt"); // 默认参数值的函数inline void clearInputs(); // 内联函数
};#endif // MAINWINDOW_H

mainwindow.h 程序释义

这个文件大家主要关注4个点就可以咯,其他的都是QT实现的功能(非重点)

class Person:基本的人员信息录入

class Teacher : public Person:教师新增信息录入,职称和部门

class Student : public Person:本科生信息录入,语数英3科成绩(排名后面会自动排序)

class Graduate : public Person:研究生新增信息录入,研究方向和导师

void savePeopleInfoToFile(const QString &filename = "people_info.txt")filename是最后保存的txt文件路径

此外,下面这个是该 .h 文件包含的C++课设考察内容,具体是哪一部分大家需要自己查看

/***************************添加一个具有默认参数值的函数。使用引用。定义内联函数。添加静态数据和常数据。***************************/

mainwindow.cpp 文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QVBoxLayout>
#include <QMessageBox>
#include <algorithm>
#include <QFile>
#include <QTextStream>
#include <QPixmap>/********************************实现默认参数值的函数。使用引用。实现内联函数。定义类的构造函数和析构函数。使用动态创建的数组或vector模板。实现继承与派生以及多态。使用文件流。********************************/MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);stackedWidget = new QStackedWidget(this);setCentralWidget(stackedWidget);setupWelcomeScreen();  // 设置初始界面setupMainMenu();setupAccountCreationMenu();setupTeacherForm();setupUndergraduateForm();setupGraduateForm();setupAccountDeletionMenu();setupLoginMenu();setupUserInfoDisplay();stackedWidget->addWidget(welcomeScreen);  // 添加初始界面到stackedWidgetstackedWidget->addWidget(mainMenu);stackedWidget->addWidget(accountCreationMenu);stackedWidget->addWidget(teacherForm);stackedWidget->addWidget(undergraduateForm);stackedWidget->addWidget(graduateForm);stackedWidget->addWidget(accountDeletionMenu);stackedWidget->addWidget(loginMenu);stackedWidget->addWidget(userInfoDisplay);stackedWidget->setCurrentWidget(welcomeScreen);  // 设置初始界面为当前显示界面
}MainWindow::~MainWindow()
{savePeopleInfoToFile();delete ui;qDeleteAll(people);
}void MainWindow::setupWelcomeScreen()
{welcomeScreen = new QWidget(this);QVBoxLayout *layout = new QVBoxLayout(welcomeScreen);welcomeLabel = new QLabel("欢迎使用人员管理系统", welcomeScreen);welcomeLabel->setAlignment(Qt::AlignCenter);welcomeImage = new QLabel(welcomeScreen);QPixmap pixmap("F://QT_code//Manage//image.jpg");  // 确保图片路径正确welcomeImage->setPixmap(pixmap);welcomeImage->setAlignment(Qt::AlignCenter);QPushButton *welcomeButton = new QPushButton("欢迎使用", welcomeScreen);QPushButton *exitButton = new QPushButton("退出", welcomeScreen);layout->addWidget(welcomeImage);layout->addWidget(welcomeLabel);layout->addWidget(welcomeButton);layout->addWidget(exitButton);connect(welcomeButton, &QPushButton::clicked, this, &MainWindow::showWelcomeScreen);connect(exitButton, &QPushButton::clicked, this, &MainWindow::exitApplication);welcomeScreen->setLayout(layout);
}void MainWindow::showWelcomeScreen()
{stackedWidget->setCurrentWidget(mainMenu);
}void MainWindow::exitApplication()
{QApplication::quit();
}void MainWindow::savePeopleInfoToFile(const QString &filename)
{QFile file(filename);if (!file.open(QIODevice::Append | QIODevice::Text)) {QMessageBox::warning(this, "错误", "无法打开文件保存信息");return;}QTextStream out(&file);for (Person *person : people) {if (Student *student = dynamic_cast<Student*>(person)) {// Calculate rankings for the studentauto calculateRanking = [&](auto scoreFunc) {std::vector<int> scores;for (Person *person : people) {if (Student *s = dynamic_cast<Student*>(person)) {scores.push_back(scoreFunc(s));}}std::sort(scores.begin(), scores.end(), std::greater<int>());auto it = std::find(scores.begin(), scores.end(), scoreFunc(student));return std::distance(scores.begin(), it) + 1;};int mathRank = calculateRanking([](Student *s) { return s->mathScore; });int chineseRank = calculateRanking([](Student *s) { return s->chineseScore; });int englishRank = calculateRanking([](Student *s) { return s->englishScore; });out << student->getInfo() << QString("\n数学成绩排名: %1\n语文成绩排名: %2\n英语成绩排名: %3\n").arg(mathRank).arg(chineseRank).arg(englishRank);} else {out << person->getInfo() << "\n";}}file.close();
}inline void MainWindow::clearInputs()
{teacherIdInput->clear();teacherNameInput->clear();teacherGenderInput->clear();teacherAgeInput->clear();teacherTitleInput->clear();teacherDepartmentInput->clear();undergradIdInput->clear();undergradNameInput->clear();undergradGenderInput->clear();undergradAgeInput->clear();undergradMathInput->clear();undergradChineseInput->clear();undergradEnglishInput->clear();gradIdInput->clear();gradNameInput->clear();gradGenderInput->clear();gradAgeInput->clear();gradResearchDirectionInput->clear();gradAdvisorInput->clear();
}void MainWindow::setupMainMenu()
{mainMenu = new QWidget(this);QVBoxLayout *layout = new QVBoxLayout(mainMenu);QPushButton *createAccountButton = new QPushButton("开户", mainMenu);QPushButton *deleteAccountButton = new QPushButton("销户", mainMenu);QPushButton *loginButton = new QPushButton("登录", mainMenu);QPushButton *exitButton = new QPushButton("退出", mainMenu);layout->addWidget(createAccountButton);layout->addWidget(deleteAccountButton);layout->addWidget(loginButton);layout->addWidget(exitButton);connect(createAccountButton, &QPushButton::clicked, this, &MainWindow::showAccountCreation);connect(deleteAccountButton, &QPushButton::clicked, this, &MainWindow::showAccountDeletion);connect(loginButton, &QPushButton::clicked, this, &MainWindow::showLogin);connect(exitButton, &QPushButton::clicked, this, &MainWindow::close);mainMenu->setLayout(layout);
}void MainWindow::setupAccountCreationMenu()
{accountCreationMenu = new QWidget(this);QVBoxLayout *layout = new QVBoxLayout(accountCreationMenu);QPushButton *teacherButton = new QPushButton("教师", accountCreationMenu);QPushButton *undergradButton = new QPushButton("本科生", accountCreationMenu);QPushButton *gradButton = new QPushButton("研究生", accountCreationMenu);QPushButton *backButton = new QPushButton("返回", accountCreationMenu);layout->addWidget(teacherButton);layout->addWidget(undergradButton);layout->addWidget(gradButton);layout->addWidget(backButton);connect(teacherButton, &QPushButton::clicked, this, &MainWindow::showTeacherForm);connect(undergradButton, &QPushButton::clicked, this, &MainWindow::showUndergraduateForm);connect(gradButton, &QPushButton::clicked, this, &MainWindow::showGraduateForm);connect(backButton, &QPushButton::clicked, this, &MainWindow::returnToMainMenu);accountCreationMenu->setLayout(layout);
}void MainWindow::setupTeacherForm()
{teacherForm = new QWidget(this);QVBoxLayout *layout = new QVBoxLayout(teacherForm);teacherIdInput = new QLineEdit(teacherForm);teacherNameInput = new QLineEdit(teacherForm);teacherGenderInput = new QLineEdit(teacherForm);teacherAgeInput = new QLineEdit(teacherForm);teacherTitleInput = new QLineEdit(teacherForm);teacherDepartmentInput = new QLineEdit(teacherForm);teacherIdInput->setPlaceholderText("教师编号");teacherNameInput->setPlaceholderText("姓名");teacherGenderInput->setPlaceholderText("性别");teacherAgeInput->setPlaceholderText("年龄");teacherTitleInput->setPlaceholderText("职称");teacherDepartmentInput->setPlaceholderText("部门");QPushButton *saveButton = new QPushButton("保存", teacherForm);QPushButton *cancelButton = new QPushButton("取消", teacherForm);layout->addWidget(teacherIdInput);layout->addWidget(teacherNameInput);layout->addWidget(teacherGenderInput);layout->addWidget(teacherAgeInput);layout->addWidget(teacherTitleInput);layout->addWidget(teacherDepartmentInput);layout->addWidget(saveButton);layout->addWidget(cancelButton);connect(saveButton, &QPushButton::clicked, this, &MainWindow::createTeacherAccount);connect(cancelButton, &QPushButton::clicked, this, &MainWindow::returnToMainMenu);teacherForm->setLayout(layout);
}void MainWindow::setupUndergraduateForm()
{undergraduateForm = new QWidget(this);QVBoxLayout *layout = new QVBoxLayout(undergraduateForm);undergradIdInput = new QLineEdit(undergraduateForm);undergradNameInput = new QLineEdit(undergraduateForm);undergradGenderInput = new QLineEdit(undergraduateForm);undergradAgeInput = new QLineEdit(undergraduateForm);undergradMathInput = new QLineEdit(undergraduateForm);undergradChineseInput = new QLineEdit(undergraduateForm);undergradEnglishInput = new QLineEdit(undergraduateForm);undergradIdInput->setPlaceholderText("本科生编号");undergradNameInput->setPlaceholderText("姓名");undergradGenderInput->setPlaceholderText("性别");undergradAgeInput->setPlaceholderText("年龄");undergradMathInput->setPlaceholderText("数学成绩");undergradChineseInput->setPlaceholderText("语文成绩");undergradEnglishInput->setPlaceholderText("英语成绩");QPushButton *continueButton = new QPushButton("继续", undergraduateForm);QPushButton *finishButton = new QPushButton("结束", undergraduateForm);QPushButton *cancelButton = new QPushButton("取消", undergraduateForm);layout->addWidget(undergradIdInput);layout->addWidget(undergradNameInput);layout->addWidget(undergradGenderInput);layout->addWidget(undergradAgeInput);layout->addWidget(undergradMathInput);layout->addWidget(undergradChineseInput);layout->addWidget(undergradEnglishInput);layout->addWidget(continueButton);layout->addWidget(finishButton);layout->addWidget(cancelButton);connect(continueButton, &QPushButton::clicked, this, &MainWindow::createUndergraduateAccount);connect(finishButton, &QPushButton::clicked, [this](){createUndergraduateAccount();returnToMainMenu();});connect(cancelButton, &QPushButton::clicked, this, &MainWindow::returnToMainMenu);undergraduateForm->setLayout(layout);
}void MainWindow::setupGraduateForm()
{graduateForm = new QWidget(this);QVBoxLayout *layout = new QVBoxLayout(graduateForm);gradIdInput = new QLineEdit(graduateForm);gradNameInput = new QLineEdit(graduateForm);gradGenderInput = new QLineEdit(graduateForm);gradAgeInput = new QLineEdit(graduateForm);gradResearchDirectionInput = new QLineEdit(graduateForm);gradAdvisorInput = new QLineEdit(graduateForm);gradIdInput->setPlaceholderText("研究生编号");gradNameInput->setPlaceholderText("姓名");gradGenderInput->setPlaceholderText("性别");gradAgeInput->setPlaceholderText("年龄");gradResearchDirectionInput->setPlaceholderText("研究方向");gradAdvisorInput->setPlaceholderText("导师");QPushButton *saveButton = new QPushButton("保存", graduateForm);QPushButton *cancelButton = new QPushButton("取消", graduateForm);layout->addWidget(gradIdInput);layout->addWidget(gradNameInput);layout->addWidget(gradGenderInput);layout->addWidget(gradAgeInput);layout->addWidget(gradResearchDirectionInput);layout->addWidget(gradAdvisorInput);layout->addWidget(saveButton);layout->addWidget(cancelButton);connect(saveButton, &QPushButton::clicked, this, &MainWindow::createGraduateAccount);connect(cancelButton, &QPushButton::clicked, this, &MainWindow::returnToMainMenu);graduateForm->setLayout(layout);
}void MainWindow::setupAccountDeletionMenu()
{accountDeletionMenu = new QWidget(this);QVBoxLayout *layout = new QVBoxLayout(accountDeletionMenu);deleteIdInput = new QLineEdit(accountDeletionMenu);deleteNameInput = new QLineEdit(accountDeletionMenu);deleteIdInput->setPlaceholderText("编号");deleteNameInput->setPlaceholderText("姓名");QPushButton *deleteButton = new QPushButton("确定销户", accountDeletionMenu);QPushButton *cancelButton = new QPushButton("取消", accountDeletionMenu);layout->addWidget(deleteIdInput);layout->addWidget(deleteNameInput);layout->addWidget(deleteButton);layout->addWidget(cancelButton);connect(deleteButton, &QPushButton::clicked, this, &MainWindow::deleteAccount);connect(cancelButton, &QPushButton::clicked, this, &MainWindow::returnToMainMenu);accountDeletionMenu->setLayout(layout);
}void MainWindow::setupLoginMenu()
{loginMenu = new QWidget(this);QVBoxLayout *layout = new QVBoxLayout(loginMenu);loginIdInput = new QLineEdit(loginMenu);loginNameInput = new QLineEdit(loginMenu);loginIdInput->setPlaceholderText("编号");loginNameInput->setPlaceholderText("姓名");QPushButton *loginButton = new QPushButton("登录", loginMenu);QPushButton *cancelButton = new QPushButton("取消", loginMenu);layout->addWidget(loginIdInput);layout->addWidget(loginNameInput);layout->addWidget(loginButton);layout->addWidget(cancelButton);connect(loginButton, &QPushButton::clicked, this, &MainWindow::login);connect(cancelButton, &QPushButton::clicked, this, &MainWindow::returnToMainMenu);loginMenu->setLayout(layout);
}void MainWindow::setupUserInfoDisplay()
{userInfoDisplay = new QWidget(this);QVBoxLayout *layout = new QVBoxLayout(userInfoDisplay);userInfoLabel = new QLabel(userInfoDisplay);QPushButton *backButton = new QPushButton("返回", userInfoDisplay);QPushButton *exitButton = new QPushButton("退出", userInfoDisplay);layout->addWidget(userInfoLabel);layout->addWidget(backButton);layout->addWidget(exitButton);connect(backButton, &QPushButton::clicked, this, &MainWindow::showLogin);connect(exitButton, &QPushButton::clicked, this, &MainWindow::returnToMainMenu);userInfoDisplay->setLayout(layout);
}void MainWindow::showAccountCreation()
{stackedWidget->setCurrentWidget(accountCreationMenu);
}void MainWindow::showAccountDeletion()
{stackedWidget->setCurrentWidget(accountDeletionMenu);
}void MainWindow::showLogin()
{stackedWidget->setCurrentWidget(loginMenu);
}void MainWindow::returnToMainMenu()
{stackedWidget->setCurrentWidget(mainMenu);clearInputs();
}void MainWindow::createTeacherAccount()
{// Validate and save teacher informationif (teacherIdInput->text().isEmpty() || teacherNameInput->text().isEmpty() ||teacherGenderInput->text().isEmpty() || teacherAgeInput->text().isEmpty() ||teacherTitleInput->text().isEmpty() || teacherDepartmentInput->text().isEmpty()){QMessageBox::warning(this, "输入错误", "请输入所有信息");return;}Teacher *teacher = new Teacher;teacher->id = teacherIdInput->text();teacher->name = teacherNameInput->text();teacher->gender = teacherGenderInput->text();teacher->age = teacherAgeInput->text().toInt();teacher->title = teacherTitleInput->text();teacher->department = teacherDepartmentInput->text();people.append(teacher);QMessageBox::information(this, "保存成功", "教师信息已保存");returnToMainMenu();
}void MainWindow::createUndergraduateAccount()
{// Validate and save undergraduate informationif (undergradIdInput->text().isEmpty() || undergradNameInput->text().isEmpty() ||undergradGenderInput->text().isEmpty() || undergradAgeInput->text().isEmpty() ||undergradMathInput->text().isEmpty() || undergradChineseInput->text().isEmpty() ||undergradEnglishInput->text().isEmpty()){QMessageBox::warning(this, "输入错误", "请输入所有信息");return;}Student *undergrad = new Student;undergrad->id = undergradIdInput->text();undergrad->name = undergradNameInput->text();undergrad->gender = undergradGenderInput->text();undergrad->age = undergradAgeInput->text().toInt();undergrad->mathScore = undergradMathInput->text().toInt();undergrad->chineseScore = undergradChineseInput->text().toInt();undergrad->englishScore = undergradEnglishInput->text().toInt();people.append(undergrad);QMessageBox::information(this, "保存成功", "本科生信息已保存");clearInputs();
}void MainWindow::createGraduateAccount()
{// Validate and save graduate informationif (gradIdInput->text().isEmpty() || gradNameInput->text().isEmpty() ||gradGenderInput->text().isEmpty() || gradAgeInput->text().isEmpty() ||gradResearchDirectionInput->text().isEmpty() || gradAdvisorInput->text().isEmpty()){QMessageBox::warning(this, "输入错误", "请输入所有信息");return;}Graduate *grad = new Graduate;grad->id = gradIdInput->text();grad->name = gradNameInput->text();grad->gender = gradGenderInput->text();grad->age = gradAgeInput->text().toInt();grad->researchDirection = gradResearchDirectionInput->text();grad->advisor = gradAdvisorInput->text();people.append(grad);QMessageBox::information(this, "保存成功", "研究生信息已保存");returnToMainMenu();
}void MainWindow::deleteAccount()
{// Validate and delete account informationif (deleteIdInput->text().isEmpty() || deleteNameInput->text().isEmpty()){QMessageBox::warning(this, "输入错误", "请输入所有信息");return;}auto it = std::find_if(people.begin(), people.end(), [&](Person* person) {return person->id == deleteIdInput->text() && person->name == deleteNameInput->text();});if (it != people.end()) {delete *it;people.erase(it);QMessageBox::information(this, "销户成功", "账号信息已删除");} else {QMessageBox::warning(this, "错误", "未找到匹配的账号信息");}returnToMainMenu();
}void MainWindow::login()
{// Validate and loginif (loginIdInput->text().isEmpty() || loginNameInput->text().isEmpty()){QMessageBox::warning(this, "输入错误", "请输入所有信息");return;}auto it = std::find_if(people.begin(), people.end(), [&](Person* person) {return person->id == loginIdInput->text() && person->name == loginNameInput->text();});if (it != people.end()) {QString userInfo = (*it)->getInfo();if (Student *student = dynamic_cast<Student*>(*it)) {// Calculate and add rankingsauto calculateRanking = [&](auto scoreFunc) {std::vector<int> scores;for (Person *person : people) {if (Student *s = dynamic_cast<Student*>(person)) {scores.push_back(scoreFunc(s));}}std::sort(scores.begin(), scores.end(), std::greater<int>());auto it = std::find(scores.begin(), scores.end(), scoreFunc(student));return std::distance(scores.begin(), it) + 1;};int mathRank = calculateRanking([](Student *s) { return s->mathScore; });int chineseRank = calculateRanking([](Student *s) { return s->chineseScore; });int englishRank = calculateRanking([](Student *s) { return s->englishScore; });userInfo += QString("\n数学成绩排名: %1\n语文成绩排名: %2\n英语成绩排名: %3").arg(mathRank).arg(chineseRank).arg(englishRank);}displayUserInfo(userInfo);} else {QMessageBox::warning(this, "错误", "输入的信息不匹配");}
}void MainWindow::displayUserInfo(const QString &userInfo)
{userInfoLabel->setText(userInfo);stackedWidget->setCurrentWidget(userInfoDisplay);
}void MainWindow::showTeacherForm()
{stackedWidget->setCurrentWidget(teacherForm);
}void MainWindow::showUndergraduateForm()
{stackedWidget->setCurrentWidget(undergraduateForm);
}void MainWindow::showGraduateForm()
{stackedWidget->setCurrentWidget(graduateForm);
}

mainwindow.cpp 程序释义

这个部分我自己写了一个详细的界面释义,大家感兴趣的可以看一下

此外,为了呈现出的可视化效果更好,我在初始界面又增添了图片展示

// 图片路径自己更改即可
QPixmap pixmap("F://QT_code//Manage//image.jpg");

同样的,这个部分的课设考察内容如下:

/********************************实现默认参数值的函数。使用引用。实现内联函数。定义类的构造函数和析构函数。使用动态创建的数组或vector模板。实现继承与派生以及多态。使用文件流。********************************/

main.h 文件

// main.cpp
#include <QApplication>
#include "mainwindow.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}/************************************************实现目标:默认形参值的函数。引用的知识。内联函数。丰富的数据类型。正确定义类,类中构造函数、析构函数完整,数据访问属性明确。静态数据、常数据。指针的正确使用。动态创建数组或vector模板的应用。继承与派生正确使用,多态。文件流的使用。************************************************/

大家直接运行 main.h 文件就可以实现全部内容啦!

TXT文件生成

该TXT文件会在点击退出键时保存所有未销户的人员信息,并不会产生覆盖,也就是说重复操作时都只会保存在这一个文件上。

总结:这个课设基本上全部实现了功能要求并且达到了评分标准,但就是可视化出的界面太丑咯呀,大家后面可以在该基础上添加背景和字体颜色这些美化的东西哦。至此,本次的C++课设就全部完成啦,希望对大家的课程设计能够有所帮助呀!

这篇关于C++课程设计:学校人员信息管理系统(可视化界面)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1005026

相关文章

如何选择适合孤独症兄妹的学校?

在探索适合孤独症儿童教育的道路上,每一位家长都面临着前所未有的挑战与抉择。当这份责任落在拥有孤独症兄妹的家庭肩上时,选择一所能够同时满足两个孩子特殊需求的学校,更显得尤为关键。本文将探讨如何为这样的家庭做出明智的选择,并介绍星贝育园自闭症儿童寄宿制学校作为一个值得考虑的选项。 理解孤独症儿童的独特性 孤独症,这一复杂的神经发育障碍,影响着儿童的社交互动、沟通能力以及行为模式。对于拥有孤独症兄

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给