暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Qt/C++ 开源项目 学生成绩管理系统(简易版)数据库常规使用与文本导入、导出使用(源码工程联系博主)

码上Qt 2024-11-18
569


点击蓝字
 
关注我们

      该学生成绩管理系统是基于 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. 代码总结

                该学生成绩管理系统的代码使用了 Qt 框架来实现一个功能全面的桌面应用。通过合理的模块化设计,系统划分为多个独立的功能模块,包括数据库操作、学生信息管理、用户界面与数据可视化等。

                功能总结:

                1. 学生管理:通过图形界面,用户可以添加、删除、查询和修改学生信息。信息持久化存储在 SQLite 数据库中,确保数据的长期保存和易访问性。

                2. 分数展示与排序:系统提供分数的正序、倒序排序功能,方便用户查看班级成绩的分布情况。

                3. 图表展示:通过柱状图显示学生的成绩,直观展示各个学生的分数情况,并使用红色虚线绘制及格线,提醒用户哪些学生未达及格分数。

                4. 数据导出与导入:支持将学生数据导出为 CSV 文件,方便进行数据备份或转移;同时也支持从 CSV 文件中导入学生数据,减少用户手动输入的工作量。

                5. 样式优化:通过样式表 (QSS),美化了用户界面,使应用程序更为美观和易用。



                END


                “阅读原文”我们一起进步

                分享
                收藏
                在看
                点赞


                欢迎关注
                微信公众号:码上Qt
                微信号:Cgsjedu


                Qt/C++开源项目基于TCP调试工具(工程源码联系作者发送文章链接)

                Qt/C++开源控件:   动态时钟,可替换背景(工程源码联系博主)

                Qt/C++开源项目:  串口调试工具高效数据收发与实时波形显示

                Qt/C++开源项目     基于Qt的MQTT通讯调试助手




                文章转载自码上Qt,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论