基于Qt实现(PC)学生信息管理系统

news2024/11/26 6:24:38

学生信息管理系统

一、系统指南

本系统为表格式的学生信息管理系统,提供了文件新建、打开及保存功能,还可在表格中对数据进行增加、删除、修改、搜索,下面将一一介绍这些功能

1、新建文件

新建文件将会产生一个全新的空表格,在新建文件时,当前表格的内容将会被删除,系统会自动检测当前表格内容是否已经被保存过,如果未保存过的,会对用户进行提示;否则将直接生成新表格

2、打开文件

系统可以打开由系统保存的、符合系统规范的.csv文件。

3、保存文件

系统将当前表格保存为.csv文件。之所以保存为.csv文件,除了考虑到这种文件具有非常规整的模式之外,还考虑到该格式可使用微软_excel_表格打开,便于实际场景中的使用。

4、增加

在系统菜单栏编辑项中和系统右键菜单中,有三种方式对表格数据进行增加,分别是“增加一行”,“上方插入一行”和“下方插入一行”。
点击“增加一行”,会在表格末尾生成一行空行。
点击“上方插入一行”,会在当前选中表格的上方插入一行空行。
点击“下方插入一行”,会在当前选中表格的下方插入一行空行。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5、删除

在系统菜单栏编辑项中和系统右键菜单中,提供了“删除”选项。
点击删除选项之后,当前选中的行会被删除掉。

6、修改

双击表项即可进入编辑模式,对表格内容进行编辑。其中性别、专业和出生日期栏还提供了下拉选择项,便于使用者对其进行编辑。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

7、搜索

系统工具栏中有一个搜索文本框,用户只需要在框中输入搜索内容,之后点击窗口右边的“搜索”按钮即可进行搜索。除了搜索按钮以外,还有“上一个”和“下一个”按钮,用以继续查询。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

8、排序

若要按照某个属性进行排序,只需要双击该属性表头即可。首次点击按照字符正序按该列对表格进行扩展排序,再次点击进行倒序排序,再次点击又变为正序排序,以此类推。搜索仅支持精确搜索,不支持模糊搜索。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二、系统实现

本系统主要由三个继承类构成,一个是_MianWindow_类,它继承自_QMainWindow_类,是系统的主要部分,另外两个类为_Delegate_和_DateDelegate_类,它们都继承自_QItemDelegate_类,用以实现表项中的下拉选项,前者实现了性别和专业方向下拉选项,后者实现了出生日期的下拉选项。
MainWindow类中还集成了QAction类、QWidget类、QLayout类、QTableWidget类、QLineEdit类、QPushButton类、QString类。请注意,系统中出现的其他Qt类,以及dialog.cpp、student.cpp、studentdatabase.cpp和他们对应的头文件中封装的类,仅为系统实现过程中的遗产代码,在系统中不发挥作用,仅为日后留作他用。

1、MainWindow类

MainWindow类属性和接口定义如下

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
protected:
    void closeEvent(QCloseEvent *event);
private:
    Ui::MainWindow *ui;
    //文件保存标识符
    bool saved;
    
    QWidget *widget;

    //布局管理器
    QLayout *layout;

    //表格及其初始化函数
    QTableWidget *table;
    void tableInitialize();

    //菜单栏选项
    QAction *newAction;
    QAction *openAction;
    QAction *saveAction;
    QAction *exitAction;
    QAction *addAction;
    QAction *deleteAction;
    QAction *moveUpAction;
    QAction *moveDownAction;
    QAction *insertAction;
    
    //排序辅助数组。用于实现对某属性的第奇数次为正排,偶数次为倒排
    bool c[8];
    
    //储存有表格下拉选项的QComboBox
    QVector<QComboBox*> *QComboBoxList;

    //工具栏搜索的文本框、三个按钮和搜索关键词
    QLineEdit *searchQLineEditToolBar;
    QPushButton *searchButton;
    QPushButton *lastButton;
    QPushButton *nextButton;
    //搜索文本
    QString searchQstr;
    //当前搜索到的表格位置
    int searchRow;
    int searchColumn;

    //快速排序,按照字符串比较顺序   
    int partition(int p, int q, int column);
    void quickSort(int p, int q, int column);
    void Swap(int p1,int p2, int column);

    //表项右键菜单
    virtual void contextMenuEvent(QContextMenuEvent *event);

private slots:
    //响应函数们

    //新建文件
    void newFile();
    //打开文件
    void openFile();
    //保存文件
    void saveFile();
    //表格末尾增加一行
    void addModify();
    //菜单栏中的删除当前行
    void deleteModify();
    //菜单栏中的当前行上移一行
    void moveUpModify();
    //菜单栏中的当前行下移一行
    void moveDownModify();
    //按照选定属性进行排序
    //参数是选定属性所在列的索引
    void sortView(int colunmIndex);
    //表格修改
    //表格修改后,将saved改为false,标识文件未保存
    void tableModify(int row,int column);
    //在当前行上一行插入空行
    void insertBefore();
    //在当前行下一行插入空行
    void insertAfter();
    //右键菜单中的删除当前行
    //实际上与菜单栏中的删除当前行响应函数(void deleteModify())没有区别
    void deleteLine();
    //搜索文本获取
    //每当搜索文本框中内容改变时,调用该函数对搜索文本searchQstr进行赋值
    void searchQlineEditChanged(QString qstr);
    //搜索按钮响应函数
    //执行搜索,搜出第一个符合的位置并选中高亮。搜不到的话表格不会有任何变化。
    void searchToolBarTriggered();
    //搜索上一个
    void lastToolBarTriggered();
    //搜索下一个
    void nextToolBarTriggered();
};

2、Delegate类

Delegate类继承自QDelegate类,用以实现的性别和专业自定义委托。Delegate类属性和接口定义如下

class Delegate : public QItemDelegate
{
    Q_OBJECT

public:
    
    Delegate(QObject *parent = nullptr);
    ~Delegate();
    //绘制下拉选项菜单
    void paint(QPainter *painter, const QStyleOptionViewItem &option,
        const QModelIndex &index) const;
    //下拉选项大小
    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
    //创建自定义按钮
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    //设置自定义按钮内容
    void setEditorData(QWidget *editor, const QModelIndex &index) const;

    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;

private:

};

3、DateDelegate类

DateDelegate类也继承自QDelegate类,用以实现出生日期的自定义委托,DateDelegate类属性和接口定义如下

class DateDelegate : public QItemDelegate
{
    Q_OBJECT

public:
    DateDelegate(QObject *parent = nullptr);
   ~DateDelegate();

    //返回改变Model数据的widget,该widget是经过定制行为的Widget
    QWidget *createEditor(QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index) const;

    //将可操作的数据提供给widget
    void setEditorData(QWidget * editor, const QModelIndex & index) const;
    
    //将widget的数据展示到Item中
    void setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const;  

    //确保widget能够正确显示到view中
    void updateEditorGeometry(QWidget * editor, const QStyleOptionViewItem & option, const QModelIndex & index) const;
private:

};

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

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

相关文章

【Redis入门到精通十】Redis哨兵

目录 哨兵&#xff08;Sentinel&#xff09; 1.哨兵的由来 2.哨兵的基本概念 3.基于docker安装配置Redis哨兵 4.哨兵选取主节点的原理 1.主观下线 2.客观下线 3.选举出哨兵的leader 4.leader挑选出合适的slave成为新的master 哨兵&#xff08;Sentinel&#xff09; Red…

2-117 基于matlab的共振峰估计

基于matlab的共振峰估计&#xff0c;共振峰参数包括共振峰频率和频带的宽度&#xff08;带宽&#xff09;。共振峰信息主要包含在语音频谱的包络中&#xff0c;其关键是估计自然语音频谱包络&#xff0c;通过倒谱法、LPC内插法、LPC求根法实现共振峰估计。程序已调通&#xff0…

Spark_累加器

分布式共享只写变量 实现原理&#xff1a;  累加器用来把Executor端变量信息聚合到Driver端&#xff0c;在Driver程序中定义的变量&#xff0c;在Executor端的每个Task都会得到这个变量的一份新的副本&#xff0c;每个task更新这些副本的值后&#xff0c;传回Driver端进行mer…

计算机视觉的应用36-人工智能时代计算机视觉技术在电力系统中的应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用36-人工智能时代计算机视觉技术在电力系统中的应用。本文综述了人工智能时代计算机视觉技术在电力系统中的应用。文章首先介绍了项目背景&#xff0c;随后详细阐述了计算机视觉技术的模型、技术原理…

轻松实现本地部署:任何人都能安装顶尖开源模型 LLaMA3!

引言 LLaMA3 在 2024年4月18 日正式发布了&#xff0c;作为开发人员怎么能不蹭一下热度&#xff0c;体验一下可以在个人电脑端部署的大语言模型呢&#xff1f;文末领取安装包和安装文档&#xff01; LLaMA3 LaMA3 是一个自回归语言模型&#xff0c;使用了优化的 Transformer …

Java后端面试题(day16)

目录 java常见的引用类型java中深拷贝和浅拷贝如何设计一个秒杀系统?谈一下对高并发的理解&#xff0c;平时怎么处理高并发问题?Comparable和Comparator区别&#xff1f;解决hash冲突有哪些方法&#xff1f;Synchronized锁的升级过程 java常见的引用类型 java的引用类型一般分…

【数据结构与算法】简单聊聊图数据的存储

文章目录 1. 邻接矩阵&#xff08;Adjacency Matrix&#xff09;2. 邻接表&#xff08;Adjacency List&#xff09;3. 邻接多重表4. 十字链表5. 图数据库&#xff08;Graph Database&#xff09; 存储图数据的方法主要有几种&#xff0c;每种方法都有其特定的应用场景和优缺点。…

【工具】前端js数字金额转中文大写金额

【工具】前端js数字金额转中文大写金额 代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>金额转…

快递批量查询物流追踪只揽收无物流信息的单号

在电子商务和物流领域&#xff0c;快递单号的追踪是确保货物顺利送达的关键环节。然而&#xff0c;在实际操作中&#xff0c;经常会遇到一些只显示揽收信息而没有后续物流更新的单号&#xff0c;这给商家和买家都带来了不小的困扰。本文将介绍如何通过快递批量查询物流的方法&a…

jdk多版本来回切换不生效

本人电脑安装了两个jdk1.8跟17 但是安装完17后发现怎么切换版本都是17&#xff0c;如图 解决思路也很简单&#xff0c;就是找到path 将%JAVA_HOME%/bin提到最前头&#xff0c;就解决了 但是需要注意的是jdk11以上就没有jre了

YOLO11改进|注意力机制篇| 引入SpatialGroupEnhance注意力机制

目录 一、【 SpatialGroupEnhance】注意力机制1.1【 SpatialGroupEnhance】注意力介绍1.2【SpatialGroupEnhance】核心代码 二、添加【SpatialGroupEnhance】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【 SpatialGroupEnh…

leetcode:反转字符串II

题目链接 string reverse(string s1) {string s2;string::reverse_iterator rit s1.rbegin();while (rit ! s1.rend()){s2 *rit;rit;}return s2; } class Solution { public:string reverseStr(string s, int k) {string s1;int i 0;//标记字符串下标int j 0;int length …

程序员在AI时代扮演着多重角色:不仅是AI技术的创造者,也是使用者,更是AIGC的贡献者

程序员在AI时代扮演着多重角色&#xff1a;不仅是AI技术的创造者&#xff0c;也是使用者&#xff0c;更是AIGC的贡献者 引言 大家好&#xff0c;我是猫头虎&#xff0c;在当下的AI时代&#xff0c;程序员不仅是AI技术的推动者&#xff0c;更在这个生态中扮演着多重角色&#…

ARM base instruction -- sdiv

有符号除法运算 Signed Divide divides a signed integer register value by another signed integer register value, and writes the result to the destination register. The condition flags are not affected. 将一个有符号整数寄存器值除以另一个有符号整数寄存器值&am…

YOLOv11训练自己数据集_笔记1

一、前言 官网yolov11-main yolov11代码地址 分析YOLO11的关键改进点 YOLO11 相比之前版本&#xff0c;带来了五大关键改进&#xff1a; 增强特征提取&#xff1a;通过改进Backbone和Neck架构&#xff0c;新增了C3k2和C2PSA等组件&#xff0c;提升了目标检测的精度。 优化效率…

python使用装饰器来统计函数被调用次数、格式化dict以及Python-smtplib邮件发送的IP name possibly forged问题解决

一、python调试&#xff1a;使用装饰器来统计函数被调用次数及格式化dict 喜欢调试的时候显示数据并显示一些其它的信息&#xff0c;比如区分是哪次调用的调试信息&#xff0c;比如友好的显示dict等相对复杂的数据类型&#xff0c;所以这里涉及到两个方面。一是统计函数被调用次…

Centos再生龙系统迁移

Centos再生龙系统迁移 1.准备工作1.1rufus镜像刻录软件1.2再生龙镜像1.3硬盘和U盘2.准备u盘启动工具2.1刻录再生龙镜像3.备份系统3.1选择U盘启动3.2选择分辨率3.3选择中文3.4选择默认键盘配置3.5使用再升龙3.6选择第一个,device-image硬盘/分区存到/来自镜像文件3.7选择local_…

运维问题0004:MM模块-操作MIGO过账报错“对象OFN_YR 2840 WE2840 的编码范围没有找到”

1、问题分析 当在SAP系统MM模块的MIGO过账时出现“对象OFN_YR 2840 WE2840的编码范围没有找到”错误&#xff0c;这通常是因为系统配置中缺少对应的编码范围。先来分析一下报错消息号信息&#xff1a;OFN_YR是后台自动凭证编号范围配置的事务代码;2840是工厂名称 ;WE2840是指接…

地理空间数据共享资源,爱好者进

地理空间数据共享资源&#xff0c;爱好者进 1、1986–2021年中国30m逐年耕地数据集 由于农田的空间和时间模式对食品安全和环境可持续性的供应至关重要&#xff0c;因此长期和准确的农田监测非常重要。研究团队开发了一种新颖、经济的年度农田映射框架&#xff0c;该框架集成…

【C++】适配器stack/queue/priority_queue使用和实现

目录 容器适配器 什么是容器适配器 ​编辑stack stack的了解和使用 使用举例 题目加深 模拟实现 功能实现 测试文件 ​编辑queue queue的了解和使用 使用举例 题目加深 模拟实现 功能实现 测试文件 priority_queue priority_queue的了解和使用 使用举…