

该学生成绩管理系统是基于 Qt 框架开发的桌面应用程序,使用 SQLite 数据库进行数据持久化。系统支持学生信息的增删改查功能,并提供分数排序、柱状图显示、及格线警示、数据导入导出等功能。系统的主要功能通过 DatabaseManager
、StudentManager
和 MainWindow
类来实现。本文将详细分析各个功能模块,并逐步解释代码的实现逻辑。

1. 数据库管理模块(DatabaseManager)
DatabaseManager
类负责与 SQLite 数据库进行交互。它的主要功能是管理学生的基本信息(如姓名、分数)的持久化存储。关键功能包括:添加学生、删除学生、更新学生信息、查找学生以及学生数据的重新编号。
主要功能:
数据库初始化:创建
students.db
数据库,并在其中创建students
表(包括id
、name
、score
字段)。学生增删改查:实现了学生的添加、删除、更新、查询功能。
数据持久化:所有的学生数据存储在 SQLite 数据库中。
重新编号:删除学生后,重新给学生编号,保证 ID 连续。
void DatabaseManager::addStudent(const Student& student) {QSqlQuery query(db);query.prepare("INSERT INTO students (name, score) VALUES (:name, :score)");query.bindValue(":name", student.getName());query.bindValue(":score", student.getScore());query.exec();}
2. 学生管理模块(StudentManager)
StudentManager
类封装了与 DatabaseManager
的交互,提供更高层次的操作和功能,如分数的统计(最高分、最低分、平均分)以及批量添加学生等。
主要功能:
分数统计:计算班级学生的平均分、最高分和最低分。
批量管理:支持批量添加学生数据。
数据查询:通过姓名查找特定的学生。
double StudentManager::calculateAverageScore() {QList<Student> students = getAllStudents();if (students.isEmpty()) return 0.0;double totalScore = 0.0;for (const Student& student : students) {totalScore += student.getScore();}return totalScore students.size();}
3. 用户界面模块(MainWindow)
MainWindow
类是应用程序的主要界面,它使用 Qt 提供的控件来构建用户交互界面,支持以下主要功能:
输入与显示学生信息:用户可以通过文本框和按钮添加学生信息,学生列表以表格的形式显示在界面上。
数据导出导入:系统支持将学生数据导出为 CSV 文件,同时也能从 CSV 文件中导入数据。
分数排序:支持按学生分数的正序和倒序排序。
柱状图显示:使用
QChart
库生成柱状图来展示学生的分数情况,并在柱状图中绘制及格线。
界面布局:
输入框和按钮:允许用户输入学生姓名、分数并进行添加、删除、刷新操作。
学生表格:展示学生列表,包括学生编号、姓名和分数,并支持列宽自适应和排序功能。
查询与排序控件:提供学生姓名的查询功能,并支持按分数正序或倒序排列。
导出与导入功能:支持将数据导出到 CSV 文件或从 CSV 文件中导入数据。
主要功能示例:
添加学生:
void MainWindow::addStudent() {QString name = nameEdit->text();double score = scoreSpin->value();if (name.isEmpty() || score < 0) {QMessageBox::warning(this, "Input Error", "Invalid name or score.");return;}Student student(getNextStudentId(), name, score);studentManager.addStudent(student);refreshStudentTable();updateChart();}
查询学生:
void MainWindow::searchStudents() {QString name = searchEdit->text();auto students = studentManager.findStudentsByName(name);refreshStudentTable(students);updateChart();}
数据导出功能:
void MainWindow::exportData() {QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "", tr("CSV (*.csv)"));if (fileName.isEmpty()) {return;}QFile file(fileName);if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {QMessageBox::warning(this, tr("Error"), tr("Unable to open file"));return;}QTextStream stream(&file);QStringList strList;// 写入标题for (int c = 0; c < studentTable->horizontalHeader()->count(); ++c) {strList << "\"" + studentTable->model()->headerData(c, Qt::Horizontal).toString() + "\"";}stream << strList.join(",") << "\n";// 写入数据for (int r = 0; r < studentTable->rowCount(); ++r) {strList.clear();for (int c = 0; c < studentTable->columnCount(); ++c) {strList << "\"" + studentTable->item(r, c)->text() + "\"";}stream << strList.join(",") << "\n";}file.close();}
4. 数据可视化模块(柱状图与及格线)
系统支持使用柱状图显示学生分数,并在图中绘制及格线(60分)。柱状图使用 QtCharts
模块创建,并且根据学生人数动态调整横轴刻度和显示效果。
主要功能:
分数柱状图:展示班级内所有学生的分数。
及格线警告:在图表中绘制及格线,便于直观判断哪些学生的分数低于及格线。
数据同步:在添加、删除或修改学生信息后,实时更新柱状图。
QChart* MainWindow::createChart() {QBarSeries *series = new QBarSeries();QBarSet *set = new QBarSet(tc("及格线"));QStringList categories;QList<Student> students = studentManager.getAllStudents();for (const Student &student : students) {*set << student.getScore(); // 将分数添加到柱状图categories << student.getName(); // 将学生名字添加到类别中}series->append(set);QChart *chart = new QChart();chart->addSeries(series);chart->setTitle(tc("班级成绩柱状图"));chart->setAnimationOptions(QChart::SeriesAnimations);QBarCategoryAxis *axisX = new QBarCategoryAxis();axisX->append(categories); // 设置类别为学生姓名chart->addAxis(axisX, Qt::AlignBottom);series->attachAxis(axisX);QValueAxis *axisY = new QValueAxis();axisY->setRange(0, 100);axisY->setTickInterval(10);chart->addAxis(axisY, Qt::AlignLeft);series->attachAxis(axisY);// 在 60 分位置绘制一条横线作为及格线QLineSeries *passLine = new QLineSeries();passLine->append(QPointF(-5, 60));passLine->append(QPointF(students.count(), 60)); // 覆盖整个 X 轴范围QPen pen(Qt::red, 2, Qt::DashLine); // 红色虚线passLine->setPen(pen);chart->addSeries(passLine);passLine->attachAxis(axisX);passLine->attachAxis(axisY);return chart;}
5. 数据导入模块(CSV 文件)
系统支持从 CSV 文件中导入学生数据,避免手动输入,提高操作效率。导入时系统会检查是否存在重复的学生姓名,并避免重复添加。
void MainWindow::importData() {QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", tr("CSV (*.csv)"));if (fileName.isEmpty()) {return;}QFile file(fileName);if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {QMessageBox::warning(this, tr("Error"), tr("Unable to open file"));return;}QTextStream stream(&file);// 忽略第一行标题if (!stream.atEnd()) {stream.readLine();}QSet<QString> existingNames;for (const auto &student : studentManager.getAllStudents()) {existingNames.insert(student.getName());}int nextId = getNextStudentId();while (!stream.atEnd()) {QString line = stream.readLine();QStringList strList = line.split(",");if (strList.size() >= 3) {QString name = strList.at(1).trimmed().replace("\"", "");double score = strList.at(2).trimmed().replace("\"", "").toDouble();// 仅添加不存在的新名字if (!existingNames.contains(name)) {Student student(nextId++, name, score);studentManager.addStudent(student);existingNames.insert(name);}}}file.close();refreshStudentTable(); // 更新表格updateChart(); // 更新图表}
6. 代码总结
功能总结:
学生管理:通过图形界面,用户可以添加、删除、查询和修改学生信息。信息持久化存储在 SQLite 数据库中,确保数据的长期保存和易访问性。
分数展示与排序:系统提供分数的正序、倒序排序功能,方便用户查看班级成绩的分布情况。
图表展示:通过柱状图显示学生的成绩,直观展示各个学生的分数情况,并使用红色虚线绘制及格线,提醒用户哪些学生未达及格分数。
数据导出与导入:支持将学生数据导出为 CSV 文件,方便进行数据备份或转移;同时也支持从 CSV 文件中导入学生数据,减少用户手动输入的工作量。
样式优化:通过样式表 (QSS),美化了用户界面,使应用程序更为美观和易用。







●Qt/C++开源项目:基于TCP调试工具(工程源码联系作者发送文章链接)
●Qt/C++开源控件: 动态时钟,可替换背景(工程源码联系博主)




