【无标题】

1.引言

  • 查询班级学生信息并显示在两个表格中。
  • 点击学生记录,显示对应的学科成绩
  • 查询按钮触发信号,调用 onQueryButtonClicked,加载数据。
  • 左侧表格点击信号,调用 onStudentItemClicked,更新右侧表格。
  • 清空按钮触发信号,调用 onClearButtonClicked,清空所有表格内容。

2. 项目需求分析

2.1功能需求:

  • 界面由三部分组成:
    • 顶部控件:包括开始时间、结束时间输入框,查询按钮和清空按钮。
    • 左侧表格:显示学生基本信息,包括编号、查询时间、等级类型、爱好(多个爱好用 | 隔开)。
    • 右侧表格:显示选中学生的全年成绩,包括每月语文、数学和英语成绩。

2.2交互需求:

  • 点击查询按钮,左侧表格加载班级学生信息,右侧表格显示第一个学生的全年成绩。
  • 点击左侧学生信息时,右侧表格更新为对应学生的成绩。
  • 点击清空按钮,清空两个表格内容。

3 界面布局设计

±----------------------------------------+
| 开始时间 | 结束时间 | 查询 | 清空 |
±----------------------------------------+
| 左侧表格 | 右侧表格 |
| 学生信息 | 全年成绩 |
±----------------------------------------+

4 界面效果展示

在这里插入图片描述

5 完整代码实现

5.1头文件:mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTableWidget>
#include <QPushButton>
#include <QDateEdit>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void onQueryButtonClicked();   // 查询按钮槽函数
    void onClearButtonClicked();   // 清空按钮槽函数
    void onStudentItemClicked(int row, int column); // 点击学生条目槽函数

private:
    void setupUI();                // 初始化UI
    void loadStudentData();        // 加载学生数据
    void loadStudentScores(int studentId); // 加载学生成绩数据

    QDateEdit *startDateEdit;      // 开始时间选择框
    QDateEdit *endDateEdit;        // 结束时间选择框
    QPushButton *queryButton;      // 查询按钮
    QPushButton *clearButton;      // 清空按钮
    QTableWidget *studentTable;    // 学生表格
    QTableWidget *scoreTable;      // 成绩表格

    struct Student {
        int id;                    // 学号
        QString queryTime;         // 查询时间
        QString gradeType;         // 等级类型
        QString hobbies;           // 爱好
    };

    struct Scores {
        QString month;             // 月份
        int chinese;               // 语文成绩
        int math;                  // 数学成绩
        int english;               // 英语成绩
    };

    QList<Student> students;       // 学生信息列表
    QMap<int, QList<Scores>> scoresMap; // 学生成绩映射
};

#endif // MAINWINDOW_H

5.2实现文件:mainwindow.cpp

#include "MainWindow.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
    setupUI();         // 初始化UI
    loadStudentData(); // 加载学生测试数据
}

MainWindow::~MainWindow() {}

void MainWindow::setupUI() {
    // 顶部控件:时间选择、查询按钮、清空按钮
    startDateEdit = new QDateEdit(QDate::currentDate(), this);
    endDateEdit = new QDateEdit(QDate::currentDate(), this);
    queryButton = new QPushButton("查询", this);
    clearButton = new QPushButton("清空", this);

    QHBoxLayout *topLayout = new QHBoxLayout();
    topLayout->addWidget(new QLabel("开始时间:"));
    topLayout->addWidget(startDateEdit);
    topLayout->addWidget(new QLabel("结束时间:"));
    topLayout->addWidget(endDateEdit);
    topLayout->addWidget(queryButton);
    topLayout->addWidget(clearButton);

    // 左侧学生表格
    studentTable = new QTableWidget(this);
    studentTable->setColumnCount(4);
    studentTable->setHorizontalHeaderLabels(QStringList() << "学生编号" << "查询时间" << "等级类型" << "爱好");
    studentTable->setSelectionBehavior(QAbstractItemView::SelectRows);
    studentTable->setEditTriggers(QAbstractItemView::NoEditTriggers);

    // 右侧成绩表格
    scoreTable = new QTableWidget(this);
    scoreTable->setColumnCount(4);
    scoreTable->setHorizontalHeaderLabels(QStringList() << "月份" << "语文成绩" << "数学成绩" << "英语成绩");
    scoreTable->setEditTriggers(QAbstractItemView::NoEditTriggers);

    // 左右表格水平布局
    QHBoxLayout *middleLayout = new QHBoxLayout();
    middleLayout->addWidget(studentTable, 2);
    middleLayout->addWidget(scoreTable, 3);

    // 总布局
    QVBoxLayout *mainLayout = new QVBoxLayout();
    mainLayout->addLayout(topLayout);
    mainLayout->addLayout(middleLayout);

    QWidget *centralWidget = new QWidget(this);
    centralWidget->setLayout(mainLayout);
    setCentralWidget(centralWidget);

    // 信号与槽连接
    connect(queryButton, SIGNAL(clicked()), this, SLOT(onQueryButtonClicked()));
    connect(clearButton, SIGNAL(clicked()), this, SLOT(onClearButtonClicked()));
    connect(studentTable, SIGNAL(cellClicked(int, int)), this, SLOT(onStudentItemClicked(int, int)));
}

void MainWindow::loadStudentData() {
    // 添加测试学生数据
    students = {
        {1, "2024-12-01", "优秀", "篮球|钢琴|编程"},
        {2, "2024-12-02", "良好", "足球|书法|阅读"},
        {3, "2024-12-03", "及格", "游泳|跑步|写作"},
        {4, "2024-12-04", "优秀", "羽毛球|阅读|音乐"},
        {5, "2024-12-05", "优秀", "美术|跑步|电影"}
    };

    scoresMap[1] = {{"一月", 95, 88, 76}, {"二月", 90, 85, 80}, {"三月", 92, 84, 82}};
    scoresMap[2] = {{"一月", 78, 68, 72}, {"二月", 80, 70, 75}, {"三月", 85, 72, 77}};
    scoresMap[3] = {{"一月", 60, 55, 58}, {"二月", 62, 57, 60}, {"三月", 65, 59, 61}};
    scoresMap[4] = {{"一月", 88, 90, 85}, {"二月", 91, 89, 86}, {"三月", 93, 92, 87}};
    scoresMap[5] = {{"一月", 85, 80, 90}, {"二月", 87, 82, 92}, {"三月", 88, 84, 95}};
}

void MainWindow::loadStudentScores(int studentId) {
    // 加载指定学生的成绩数据
    scoreTable->clearContents();
    scoreTable->setRowCount(0);

    if (!scoresMap.contains(studentId)) return;

    const QList<Scores> &scores = scoresMap[studentId];
    scoreTable->setRowCount(scores.size());
    for (int i = 0; i < scores.size(); ++i) {
        scoreTable->setItem(i, 0, new QTableWidgetItem(scores[i].month));
        scoreTable->setItem(i, 1, new QTableWidgetItem(QString::number(scores[i].chinese)));
        scoreTable->setItem(i, 2, new QTableWidgetItem(QString::number(scores[i].math)));
        scoreTable->setItem(i, 3, new QTableWidgetItem(QString::number(scores[i].english)));
    }
}

void MainWindow::onQueryButtonClicked() {

    /*

 // 清空旧数据
    students.clear();
    scoresMap.clear();

    // 模拟动态获取数据(可替换为实际的数据获取逻辑,如从数据库或文件加载)
    students = {
        {6, "2024-12-06", "优秀", "跑步|钢琴|绘画"},
        {7, "2024-12-07", "良好", "足球|舞蹈|读书"},
        {8, "2024-12-08", "及格", "羽毛球|摄影|象棋"}
    };

    scoresMap[6] = {{"一月", 98, 92, 85}, {"二月", 96, 94, 88}, {"三月", 97, 93, 86}};
    scoresMap[7] = {{"一月", 82, 79, 75}, {"二月", 85, 80, 78}, {"三月", 88, 81, 79}};
    scoresMap[8] = {{"一月", 61, 58, 55}, {"二月", 63, 60, 57}, {"三月", 65, 62, 59}};

    // 更新左侧表格
    studentTable->clearContents();
    studentTable->setRowCount(students.size());

    for (int i = 0; i < students.size(); ++i) {
        studentTable->setItem(i, 0, new QTableWidgetItem(QString::number(students[i].id)));
        studentTable->setItem(i, 1, new QTableWidgetItem(students[i].queryTime));
        studentTable->setItem(i, 2, new QTableWidgetItem(students[i].gradeType));
        studentTable->setItem(i, 3, new QTableWidgetItem(students[i].hobbies));
        studentTable->setItem(i, 4, new QTableWidgetItem(QString::number(students[i].id))); // 隐藏ID列
    }

    // 加载第一个学生的成绩
    if (!students.isEmpty()) {
        loadStudentScores(students[0].id);
    }
*/
    // 查询按钮逻辑:加载所有学生信息
    studentTable->clearContents();
    studentTable->setRowCount(students.size());

    for (int i = 0; i < students.size(); ++i) {
        studentTable->setItem(i, 0, new QTableWidgetItem(QString::number(students[i].id)));
        studentTable->setItem(i, 1, new QTableWidgetItem(students[i].queryTime));
        studentTable->setItem(i, 2, new QTableWidgetItem(students[i].gradeType));
        studentTable->setItem(i, 3, new QTableWidgetItem(students[i].hobbies));
    }

    if (!students.isEmpty()) {
        loadStudentScores(students[0].id); // 默认加载第一个学生的成绩
    }
}

void MainWindow::onClearButtonClicked() {
    // 清空按钮逻辑
    studentTable->clearContents();
    studentTable->setRowCount(0);

    scoreTable->clearContents();
    scoreTable->setRowCount(0);
}

void MainWindow::onStudentItemClicked(int row, int /*column*/) {
    // 点击学生条目逻辑:加载对应学生成绩
    if (row >= 0 && row < students.size()) {
        int studentId = students[row].id;
        loadStudentScores(studentId);
    }
    /*
    // 使用隐藏列的ID找到对应学生
    if (row >= 0) {
        int studentId = studentTable->item(row, 4)->text().toInt();
        loadStudentScores(studentId);
    }
    */
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值