C++学习笔记 | 基于Qt框架开发实时成绩显示排序系统1

目标:旨在开发一个用户友好的软件工具,用于协助用户基于输入对象的成绩数据进行排序。该工具的特色在于,新输入的数据将以红色高亮显示,从而直观地展现出排序过程中数据变化的每一个步骤。

结果展示:

        本程序是一个基于Qt框架开发的用户友好型软件工具,专为管理和展示运动员成绩信息而设计。 该程序的亮点在于其直观的数据展示方式。新输入或更新的运动员数据会以红色高亮显示,使用户能够清晰地追踪每次操作后数据的变化。 通过精心设计的GUI,该工具提供了清晰、易于导航的用户界面,包括用于数据展示的表格视图、用于输入和编辑运动员信息的表单,以及一系列操作按钮,如排序、添加新运动员、编辑选定运动员和删除运动员等。整个应用旨在为教练、体育分析师或团队管理者等用户提供一个高效、直观的运动员管理和分析平台。 

        话不多说直接上代码!


一、算法实现 (此步请直接跳过)

关于如何使用VSCode实现C++编程给大家推荐这个博文,写的很好:vscode配置C/C++环境(超详细保姆级教学)-CSDN博客

1)先定义一个对象,包含姓名、年龄、身高和成绩等属性。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;class Athlete {
public:string name;int age;float height;float score;Athlete(string n, int a, float h, float s) : name(n), age(a), height(h), score(s) {}bool operator < (const Athlete& athlete) const {return score < athlete.score;}
};

2)若数据集小直接插入排序最快,数据集大快速排序比较好,因此选取了这两种方法,可根据数据集大小自行选择。

// 直接插入排序
void insertionSort(vector<Athlete>& arr) {for (int i = 1; i < arr.size(); i++) {Athlete key = arr[i];int j = i - 1;while (j >= 0 && arr[j].score > key.score) {arr[j + 1] = arr[j];j = j - 1;}arr[j + 1] = key;}
}// 快速排序
int partition(vector<Athlete>& arr, int low, int high) {float pivot = arr[high].score;int i = (low - 1);for (int j = low; j <= high - 1; j++) {if (arr[j].score < pivot) {i++;swap(arr[i], arr[j]);}}swap(arr[i + 1], arr[high]);return (i + 1);
}void quickSort(vector<Athlete>& arr, int low, int high) {if (low < high) {int pi = partition(arr, low, high);quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);}
}

算法相关的内容大概就这些,现在开始使用Qt实现可视化界面。


二、Qt 实现

Qt下载:Index of /archive/qt
关于Qt的学习分享一个up主的课程:1.4 Qt的安装_哔哩哔哩_bilibili

程序结构文件:

1)athlete.h
#ifndef ATHLETE_H
#define ATHLETE_H#include <string>
using std::string;class Athlete {
public:string name;float scores[6] = {0}; // 假设有6轮成绩float totalScore = 0; // 总成绩// 更新指定轮次的成绩并重新计算总成绩void updateScore(int round, float score) {if (round >= 1 && round <= 6) { // 确保轮次有效scores[round - 1] = score; // 更新成绩,轮次从1开始,数组索引从0开始calculateTotalScore(); // 重新计算总成绩}}// 计算总成绩void calculateTotalScore() {totalScore = 0;for (int i = 0; i < 6; ++i) {totalScore += scores[i];}}
};#endif // ATHLETE_H
2)athletemodel.h
#ifndef ATHLETEMODEL_H
#define ATHLETEMODEL_H#include <QStandardItemModel>
#include "athlete.h" // 确保这里正确包含了你的Athlete类定义class AthleteModel : public QStandardItemModel {Q_OBJECTpublic:explicit AthleteModel(QObject *parent = nullptr);// 添加或更新运动员的成绩,根据需要创建新运动员void updateAthleteScore(const std::string& name, int round, float score);private:// 辅助函数,根据运动员名字查找对应的行。如果找不到,返回-1int findRowByName(const std::string& name);
};#endif // ATHLETEMODEL_H
3)mainwindow.h
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <vector>
#include "athlete.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void displayAthleteInfo(const std::vector<Athlete>& athletes);
private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
4)athletemodel.cpp
#include "athletemodel.h"
#include <QStandardItem>
#include <QBrush> // 用于设置颜色AthleteModel::AthleteModel(QObject *parent) : QStandardItemModel(parent) {setHorizontalHeaderLabels({"Name", "1", "2", "3", "4", "5", "6", "Total"});
}void AthleteModel::updateAthleteScore(const std::string& name, int round, float score) {int row = findRowByName(name);QBrush redBrush(Qt::red);QBrush defaultBrush(Qt::black); // 默认颜色int newRow = -1; // 新行索引// 首先,将所有行的颜色设置回默认颜色for (int r = 0; r < rowCount(); ++r) {for (int c = 0; c < columnCount(); ++c) {auto item = this->item(r, c);item->setForeground(defaultBrush);}}if (row == -1) {// 运动员不存在,创建新运动员QList<QStandardItem*> items;items << new QStandardItem(QString::fromStdString(name));for (int i = 1; i <= 6; ++i) {items << new QStandardItem(QString::number(i == round ? score : 0.0f)); // 除了当前轮次外其他成绩初始化为0}items << new QStandardItem(QString::number(score)); // 总成绩初始化为当前轮次成绩newRow = rowCount(); // 新添加的行是当前行数(因为还没有实际添加)appendRow(items);} else {// 运动员已存在,更新成绩auto scoreItem = item(row, round);float oldScore = scoreItem->text().toFloat();scoreItem->setText(QString::number(score));// 更新总成绩auto totalItem = item(row, 7);float totalScore = totalItem->text().toFloat() - oldScore + score;totalItem->setText(QString::number(totalScore));newRow = row; // 更新的行就是找到的行if (newRow != -1) {for (int column = 0; column < columnCount(); ++column) {auto item = this->item(newRow, column);item->setForeground(redBrush);}}}
}int AthleteModel::findRowByName(const std::string& name) {for (int row = 0; row < rowCount(); ++row) {if (item(row, 0)->text() == QString::fromStdString(name)) {return row;}}return -1; // 运动员不存在
}
5)main.cpp
#include "mainwindow.h"
#include "athlete.h"
#include <QApplication>int main(int argc, char *argv[])
{// 应用程序类,在一个qt应用程序中,该对象只有一个QApplication a(argc, argv);// 窗口对象MainWindow w;// 显示函数w.show();// 阻塞函数,程序事件循环return a.exec();
}
6)mainwindow.cpp
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "athletemodel.h"
#include <QSortFilterProxyModel>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);// 设置窗口标题setWindowTitle("运动员成绩显示系统");// 设置窗口图标setWindowIcon(QIcon("E:\\CoachManagementSystem\\shooting coaches and athletes.png"));auto model = new AthleteModel(this);auto proxyModel = new QSortFilterProxyModel(this);proxyModel->setSourceModel(model);ui->tableView->setModel(proxyModel);ui->comboBox->addItems({"1", "2", "3", "4", "5", "6"});connect(ui->pushButton, &QPushButton::clicked, this, [this, model, proxyModel]() {QString name = ui->textEdit_2->toPlainText().trimmed();float score = static_cast<float>(ui->doubleSpinBox->value());int round = ui->comboBox->currentIndex() + 1; // +1 because rounds are 1-basedif (name.isEmpty()) {// Handle empty name input appropriatelyreturn;}// 更新或添加运动员成绩model->updateAthleteScore(name.toStdString(), round, score); // 此方法需要在model中实现// 重新排序,这里假设proxyModel已经设置为根据总成绩降序排序proxyModel->sort(7, Qt::DescendingOrder); // 假设总成绩在第8列(列索引为7)ui->tableView->reset();});
}MainWindow::~MainWindow() {delete ui;
}
7)mainwindow.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><property name="geometry"><rect><x>0</x><y>0</y><width>1061</width><height>589</height></rect></property><property name="windowTitle"><string>MainWindow</string></property><widget class="QWidget" name="centralwidget"><widget class="QPushButton" name="pushButton"><property name="geometry"><rect><x>470</x><y>500</y><width>91</width><height>31</height></rect></property><property name="text"><string>更新</string></property></widget><widget class="QDoubleSpinBox" name="doubleSpinBox"><property name="geometry"><rect><x>350</x><y>500</y><width>91</width><height>31</height></rect></property><property name="maximum"><double>999.990000000000009</double></property></widget><widget class="QLabel" name="label"><property name="geometry"><rect><x>220</x><y>480</y><width>31</width><height>16</height></rect></property><property name="text"><string>姓名</string></property></widget><widget class="QLabel" name="label_2"><property name="geometry"><rect><x>380</x><y>480</y><width>31</width><height>16</height></rect></property><property name="text"><string>成绩</string></property></widget><widget class="QLabel" name="label_3"><property name="geometry"><rect><x>510</x><y>20</y><width>91</width><height>16</height></rect></property><property name="text"><string>实时成绩展示</string></property></widget><widget class="QTextEdit" name="textEdit_2"><property name="geometry"><rect><x>150</x><y>500</y><width>171</width><height>31</height></rect></property></widget><widget class="QComboBox" name="comboBox"><property name="geometry"><rect><x>30</x><y>500</y><width>101</width><height>31</height></rect></property></widget><widget class="QTableView" name="tableView"><property name="geometry"><rect><x>15</x><y>41</y><width>1031</width><height>421</height></rect></property></widget></widget><widget class="QMenuBar" name="menubar"><property name="geometry"><rect><x>0</x><y>0</y><width>1061</width><height>26</height></rect></property></widget><widget class="QStatusBar" name="statusbar"/></widget><resources/><connections/>
</ui>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2779317.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

游戏服务器哪家强?国内几款主流云服务器测评

游戏服务器租用多少钱一年&#xff1f;1个月游戏服务器费用多少&#xff1f;阿里云游戏服务器26元1个月、腾讯云游戏服务器32元&#xff0c;华为云26元&#xff0c;游戏服务器配置从4核16G、4核32G、8核32G、16核64G等配置可选&#xff0c;游戏专业服务器公网带宽10M、12M、15M…

决策树之scikit-learn

实例 from sklearn.datasets import load_iris from sklearn import tree import matplotlib.pyplot as plt# Load iris dataset iris load_iris() X, y iris.data, iris.target# Fit the classifier clf tree.DecisionTreeClassifier() clf clf.fit(X, y)# Plot the deci…

python 基础知识点(蓝桥杯python科目个人复习计划37)

今日复习内容&#xff1a;DFS--回溯 1.介绍 回溯&#xff1a;就是DFS是一种&#xff0c;在搜索尝试过程中寻找问题的解&#xff0c;当发现已不满足求解条件时&#xff0c;就“回溯”返回&#xff0c;尝试别的路径。 回溯更强调&#xff1a;此路不通&#xff0c;另寻他路&…

linux系统下vscode portable版本的c++/Cmake环境搭建001

linux系统下vscode portable版本的Cmake环境搭建 vscode portable 安装安装基本工具安装 build-essential安装 CMake final script code安装插件CMake Tools & cmakeC/C Extension Pack Testsettings,jsonCMakeLists.txt调试和运行工具 CG 目的&#xff1a;希望在获得一个新…

自定义Function MyRandom函数获得随机数

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书信息表格数据显示及搜索实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

C++构造和折构函数详解,超详细!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家龙年好呀&#xff0c;今天我们来学习一下C构造函数和折构函数。 文章目录 1.构造函数 1.1构造函数的概念 1.2构造函数的思想 1.3构造函数的特点 1.4构造函数的作用 1.5构造函数的操作 1.6构造函数…

k8s -ingress

概念 Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由&#xff0c;ingress能代理集群为内部的网络&#xff0c;将集群外部的HTTP/HTTPS网络请求转发至不同的service&#xff0c;其本质就是创建一个NodePort类型的svc,和一个nginx 组成 k8s中的ingress 其实是指…

c语言:全局变量与局部变量重名

结论&#xff1a; 作用域小的覆盖作用域大的&#xff0c;顺带一提&#xff0c;在C中&#xff0c;调用全局的变量前面要加:: #include <stdio.h> using namespace std;int a, b; void fun() {a 100;b 200; }int main() {int a 5, b 7;fun();printf("%d %d\n&quo…

Linux操作系统基础(十):Linux系统信息

文章目录 Linux系统信息 一、时间和日期 1、date时间 2、cal日历 二、磁盘、内存信息 Linux系统信息 本篇文章内容主要是为了方便通过远程终端维护服务器时, 查看服务器上当前 系统日期和时间 / 磁盘空间占用情况 /程序执行情况。 学习终端命令都是查询命令, 通过这些命…

假期day7

设计qq界面 代码 ui->lab1->setPixmap(QPixmap(":/pictrue/denglu.webp"));ui->lab1->setScaledContents(true);ui->lab2->setPixmap(QPixmap(":/pictrue/passwd.jpg"));ui->lab2->setScaledContents(true);ui->lab3->setP…

Python API的使用简述

文章目录 Web APIGit 和 GitHub使用 API 调用请求数据安装 requests处理响应 API处理响应字典监视API的速率限制使用 Pygal 可视化仓库改进Pygal图表添加自定义工具提示 本篇文章&#xff1a;我们叙述如何编写一个独立的程序&#xff0c;并对其获取的数据进行可视化。这个程序将…

《统计学简易速速上手小册》第4章:假设检验(2024 最新版)

文章目录 4.1 假设检验的基本概念4.1.1 基础知识4.1.2 主要案例&#xff1a;新饮料偏好测试4.1.3 拓展案例 1&#xff1a;教育方法的效果比较4.1.4 拓展案例 2&#xff1a;工作满意度调查 4.2 常见的假设检验4.2.1 基础知识4.2.2 主要案例&#xff1a;产品包装改进的效果评估4.…

考研数据结构笔记(7)

循环链表、静态链表、顺序表和链表的比较 循环链表循环单链表循环双链表 静态链表什么是静态链表如何定义一个静态链表&#xff1f;简述基本操作的实现 顺序表和链表的比较逻辑结构物理结构/存储结构数据的运算/基本运算创建销毁增加、删除查找 循环链表 循环单链表 循环双链表…

前端JavaScript篇之ajax、axios、fetch的区别

目录 ajax、axios、fetch的区别AjaxAxiosFetch总结注意 ajax、axios、fetch的区别 在Web开发中&#xff0c;ajax、axios和fetch都是用于与服务器进行异步通信的技术&#xff0c;但它们在实现方式和功能上有所不同。 Ajax 定义与特点&#xff1a;Ajax是一种在无需重新加载整个…

2023年全国职业院校技能大赛软件测试赛题第3套

2023年全国职业院校技能大赛 软件测试赛题第3套 赛项名称&#xff1a; 软件测试 英文名称&#xff1a; Software Testing 赛项编号&#xff1a; GZ034 归属产业&#xff1a; 电子与信息大类 …

第2集《佛说四十二章经》

请大家打开讲议第二面&#xff0c;二、经文大意。 在正式讲解经文之前&#xff0c;先说明本经的修学纲要。本经的经文大意共分三段&#xff0c;第一段是总标&#xff0c;第二段是别明&#xff0c;第三段是结劝。总标又分两小段&#xff0c;先看第一小段。 是经顿渐兼收。首唱…

抛弃Spring Cloud Gateway,得物 使用Netty架构100Wqps网关

说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 最近&#xff0c;尼恩指导一个小伙伴简历&#xff0c;写了一个《高并发网关项目》&#xff0c;此项目帮这个小伙拿到 字节/阿里/…

洛谷p3435 OKR-Periods of Words

题目链接 反思 我们之前用 k m p kmp kmp都是用到前缀字串的最长匹配长度&#xff0c;本题则需要利用 p m t pmt pmt数组找到最短匹配长度 思路 题目中匹配前缀的意思是&#xff0c;在字符串 a a a的前缀中&#xff0c;某个前缀自身重复两遍后能把 a a a包括进来 如图&…

【Linux】make和Makefile

目录 make和Makefile make和Makefile 我们使用vim编辑器的时候&#xff0c;在一个文件里写完代码要进行编译&#xff0c;要自己输入编译的指令。有没有一种可以进行自动化编译的方法——makefile文件&#xff0c;它可以指定具体的编译操作&#xff0c;写好makefile文件&#x…