文章目录
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);
}
*/
}