Qt实战—从零构建学生成绩管理系统(文件存储与UI交互)
1. 项目需求分析与设计思路第一次用Qt做学生成绩管理系统时我对着空白的Qt Creator界面发了半小时呆。后来发现与其直接写代码不如先拿张纸把需求理清楚。这个系统最核心的功能其实就五个增删改查排。数据结构设计是项目的骨架。我建议用一个StudentInfo类来封装学生信息包含以下字段姓名QString类型学号int类型数学成绩int类型英语成绩int类型C语言成绩int类型平均分double类型自动计算class StudentInfo { public: QString name; int id; int math; int english; int languageC; double avg; StudentInfo(QString n, int i, int m, int e, int c) { name n; id i; math m; english e; languageC c; avg (m e c) / 3.0; } };UI界面规划我走了不少弯路。最初把所有功能堆在一个窗口结果代码乱得像毛线团。后来改用多窗口设计主菜单窗口导航中心添加学生窗口带5个输入框修改/删除窗口学号检索数据修改查询窗口学号搜索结果展示排序窗口单选按钮表格展示经验之谈修改和删除功能可以合并因为它们都需要先通过学号定位学生记录。这样能减少窗口数量降低代码复杂度。2. 项目搭建与基础配置在Qt Creator中新建项目时新手常会踩两个坑一是选错项目类型二是漏掉关键库。这里给出详细步骤创建空项目文件 → 新建文件或项目 → 其他项目 → 空的Qt项目命名规范建议用StudentManagementSystem这样的驼峰命名添加Qt Widgets库在.pro文件中追加QT widgets多窗口创建技巧右键项目 → Add New → Qt → Qt设计师界面类依次创建MenuWidget主菜单AddStudentWidget添加ModifyWidget修改/删除SelectWidget查询SortWidget排序我遇到过窗口切换卡顿的问题后来发现用QStackedLayout比单纯show/hide更流畅。在MainWidget中初始化布局// mainwidget.h QStackedLayout *stackLayout; MenuWidget *menu; AddStudentWidget *addWin; //...其他窗口指针 // mainwidget.cpp stackLayout new QStackedLayout; stackLayout-addWidget(menu); stackLayout-addWidget(addWin); //...添加其他窗口 setLayout(stackLayout);3. 核心功能实现详解3.1 数据持久化存储用QFile和QTextStream读写文本文件时要注意三个关键点文件打开模式QIODevice::WriteOnly只写覆盖QIODevice::Append追加QIODevice::Text处理换行符数据格式建议用空格分隔字段例如张三 1001 85 90 78 李四 1002 92 88 95完整示例// 写入数据 QFile file(students.txt); if(file.open(QIODevice::Append | QIODevice::Text)){ QTextStream out(file); out name id math english languageC \n; file.close(); } // 读取数据 if(file.open(QIODevice::ReadOnly | QIODevice::Text)){ QTextStream in(file); while(!in.atEnd()){ QString line in.readLine(); QStringList data line.split( ); // 解析到StudentInfo对象 } }踩坑提醒一定要检查文件是否成功打开我早期版本没做判断导致数据丢失还不报错。3.2 窗口交互与信号槽主菜单到子窗口的切换推荐使用信号槽机制// menuwidget.h signals: void changeWindow(int index); // 0主菜单,1添加窗口... // menuwidget.cpp void MenuWidget::on_addButton_clicked(){ emit changeWindow(1); } // mainwidget.cpp connect(menu, MenuWidget::changeWindow, [](int index){ stackLayout-setCurrentIndex(index); });返回按钮的实现更简单void AddStudentWidget::on_returnButton_clicked(){ emit changeWindow(0); // 返回主菜单 }4. 功能模块优化技巧4.1 输入验证在添加/修改学生信息时必须验证学号是否重复遍历现有数据成绩是否在0-100范围内必填字段是否为空// 示例学号查重 bool isDuplicate(int id){ QFile file(students.txt); // ...打开文件 while(!in.atEnd()){ QStringList data in.readLine().split( ); if(data[1].toInt() id) return true; } return false; }4.2 排序算法实现四种排序方式数学/英语/C语言/平均分可以共用一套逻辑// sortwidget.cpp void SortWidget::sortData(int subject){ QVectorStudentInfo students; // ...读取数据到students std::sort(students.begin(), students.end(), [](const StudentInfo a, const StudentInfo b){ switch(subject){ case 0: return a.math b.math; case 1: return a.english b.english; case 2: return a.languageC b.languageC; default: return a.avg b.avg; } }); // 更新表格显示... }4.3 表格展示优化QTableWidget的实用设置// 设置表头 QStringList headers; headers 姓名 学号 数学 英语 C语言 平均分; ui-tableWidget-setHorizontalHeaderLabels(headers); // 自动调整列宽 ui-tableWidget-horizontalHeader()-setSectionResizeMode(QHeaderView::Stretch); // 填充数据 for(int i0; istudents.size(); i){ ui-tableWidget-setItem(i, 0, new QTableWidgetItem(students[i].name)); // ...其他列 }5. 常见问题解决方案中文乱码问题 在main.cpp中添加QTextCodec::setCodecForLocale(QTextCodec::codecForName(UTF-8));数据文件路径问题 建议使用绝对路径或者将数据文件放在可执行文件同级目录QString path QCoreApplication::applicationDirPath() /students.txt;内存泄漏检查 在pro文件中添加CONFIG debug DEFINES QT_DEBUG这个项目最让我头疼的是文件读写时的异常处理。后来总结出三板斧每次操作前检查文件是否存在读写操作放在try-catch块中重要操作前备份数据文件

相关新闻

高端品牌官网怎么做出质感?页面设计与转化布局实战建议,全程零代码,BBWEYY:AI+SAAS+GEO模式

高端品牌官网怎么做出质感?页面设计与转化布局实战建议,全程零代码,BBWEYY:AI+SAAS+GEO模式

一、为什么企业要先搭建自己的官网在 奢侈品箱包腕表销售 赛道里,企业真正缺的往往不是一个“能展示”的网站,而是一套能持续成交、能承接流量、能沉淀客户的线上增长系统。BBWEYY 的 AISAASGEO 模式,本质上就是把“建站、运营、获客”三件事…

2026/7/15 20:35:12阅读更多 →
深入解析TI C6748 DSP:架构、开发与优化实战指南

深入解析TI C6748 DSP:架构、开发与优化实战指南

1. 项目概述:为什么C6748是嵌入式信号处理领域的“多面手”在嵌入式系统开发,尤其是需要处理大量实时数据的领域,比如工业视觉、音频分析或者通信基带,选对处理器往往决定了项目的成败。这些年,我经手过不少项目&#…

2026/7/15 20:35:12阅读更多 →
AI多模态大模型:从CLIP到GPT-4o的统一架构

AI多模态大模型:从CLIP到GPT-4o的统一架构

AI多模态大模型:从CLIP到GPT-4o的统一架构多模态AI正在打破不同感知模态之间的壁垒,实现文本、图像、音频、视频的统一理解和生成。从CLIP开创性的对比学习,到GPT-4o的端到端原生多模态,这一领域经历了快速的技术迭代。本文将系统…

2026/7/15 20:30:11阅读更多 →
Python医学影像分析完整入门教程:DICOM读取、预处理、病灶分割实战

Python医学影像分析完整入门教程:DICOM读取、预处理、病灶分割实战

文章目录摘要一、前期准备:环境搭建与核心库说明1.1 依赖库安装1.2 公开测试数据集获取二、基础实操1:使用pydicom读取单张DICOM影像三、基础实操2:SimpleITK读取DICOM序列(整套CT扫描)四、医学影像核心预处理&#xf…

2026/7/15 21:35:18阅读更多 →
2026年秋招必看!有见求职全套秋招辅导服务揭秘,收费贵不贵?

2026年秋招必看!有见求职全套秋招辅导服务揭秘,收费贵不贵?

行业背景与市场机遇每到毕业季,“最难就业季”都成为热点话题。2025年高校毕业生人数突破1200万,再创历史新高,但市场能提供的高质量岗位却未同步增长。同时,结构性失业加剧,文科、商科毕业生就业难,而新能…

2026/7/15 21:35:18阅读更多 →
万字详解Java枚举:从基础语法到底层原理,吃透实战用法

万字详解Java枚举:从基础语法到底层原理,吃透实战用法

哈喽,各位Java开发者!在日常开发中,我们经常需要定义固定范围的常量,比如订单状态、性别、季节、操作类型等。早期我们习惯用 public static final 定义常量,但这种方式存在类型不安全、可读性差、无业务关联等诸多问题…

2026/7/15 21:35:18阅读更多 →
《工程识图基本功:螺纹的规定画法与标记解析》

《工程识图基本功:螺纹的规定画法与标记解析》

螺纹是机械零件上常见的结构主要用于传动,密封等作用,螺纹分为内螺纹和外螺纹,在圆柱或圆锥外表面上形成的螺纹称为外螺纹,而内表面上的就称为内螺纹螺纹的分类螺纹按照用途分可以分为这些类别,但是这并不需要我们全都…

2026/7/15 21:35:18阅读更多 →
AI-Shoujo HF Patch终极指南:一站式插件整合与游戏优化方案

AI-Shoujo HF Patch终极指南:一站式插件整合与游戏优化方案

1. 项目概述:AI-Shoujo HF Patch是什么?如果你是一位AI-Shoujo的玩家,那么你大概率听说过HF Patch这个名字。它不是一个简单的游戏修改器,也不是一个可有可无的优化工具。在我看来,HF Patch更像是一个为AI-Shoujo这款游…

2026/7/15 21:35:18阅读更多 →
SV基础之随机化(二)

SV基础之随机化(二)

一些其他的约束方法 背景 根据绿皮书第6章内容总结 核心内容 条件约束foreach软约束solve…before 我的理解 条件约束 在[[SV基础之随机化(一)]]中提到了在约束块中使用if...else,今天介绍其他几种约束办法。 一种是expression -> constra…

2026/7/15 21:30:18阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/15 6:42:19阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/15 6:12:45阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/15 10:54:00阅读更多 →
AI框架决定企业AI能走多远

AI框架决定企业AI能走多远

企业AI建设的第一性原理 企业搞AI,最关键的决定是什么?不是选哪家大模型,不是先做哪个场景,不是招多少AI人才——而是选哪个AI开发框架。 为什么?因为框架决定了企业AI能力的"天花板"。选对了框架&#xff0…

2026/7/15 0:01:30阅读更多 →
Java企业为什么需要AI框架

Java企业为什么需要AI框架

Java企业在AI时代的尴尬处境 Java是全球企业级应用开发的主流语言——全球超过一半的企业系统跑在Java上。但在AI浪潮面前,很多Java企业感到尴尬:大模型的接口是各种语言的,AI开发社区以其他语言为主流,似乎Java在AI时代"掉队…

2026/7/15 0:01:30阅读更多 →
CC3230x嵌入式开发实战:SD主机、定时器与低功耗模式深度解析

CC3230x嵌入式开发实战:SD主机、定时器与低功耗模式深度解析

1. 项目概述:为什么需要关注CC3230x的SD主机、定时器与低功耗?在物联网和嵌入式设备开发领域,我们常常面临一个核心矛盾:设备需要具备强大的连接能力、可靠的数据存储和实时控制功能,同时又必须严格控制功耗以延长电池…

2026/7/15 0:01:30阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/15 15:50:47阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/15 8:52:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/15 14:06:23阅读更多 →