【QT项目】QT6项目之基于C++的通讯录管理系统(联系人/学生管理系统)

目录

一.项目背景

二.创建工程

工程创建

添加文件 

联系人类 

功能类

三.功能实现

联系人类

person.cpp

person.h 

查询按钮槽函数

返回按钮槽函数

findperson.cpp:

addperson.cpp:

deleteperson.cpp:

changeperson.cpp:

!!显示!!

displayperson.cpp:

清除

clearperson.cpp: 

!!主窗口!!

mainwindow.cpp:

mainwindow.h:

四.总结


一.项目背景

        本学期在学C++,老师布置了作业要求使用C++完成一个联系人管理系统,同时笔者最近也在自学QT,QT的基础语言也是C++,笔者便萌生出了使用QT来完成本次作业的想法。

        由于笔者也是初学者,所以实现这次管理系统各方面选择了最简单最基础的方法。关于QT在此不介绍基础环境的搭建,基础可以看笔者以前发的文章。

  • 【QT速成】半小时入门QT6简明教程(QT快速入门)_qt pwd-CSDN博客
  • 【QT速成】半小时入门QT6简明教程(QT快速入门)_qt pwd-CSDN博客
  • 【QT速成】半小时入门QT6之QT前置知识扫盲(超详细QT工程解析)-CSDN博客
  • 【QT项目】QT项目综合练习之简易计数器(QT6+文件存储)-CSDN博客

二.创建工程

工程创建

        工程创建还是像往常一样选择QT传统窗口与qmake即可。由于我们要实现以下功能,即基础的增删改查。所以我们的思路是必须先创建一个联系人的类来供我们操作存储,接着围绕这几个功能分别创建功能类,调用以实现基础功能。

添加文件 

        思路确定后就可以正式对工程添加需要的文件了。

        右键工程名添加新文件:

联系人类 

        由于联系人是很基础的对象,不需要对其实现ui上的某些操作,所以我们这里创建联系人类时选择了纯C++类。

        命名看自己选择,我这里选择命名为Person:

 

功能类

        对于增删改查这些功能类,由于需要对其UI进行操作,所以这里我们选择创建为QT设计师类:

        注意:每个功能都要创建一个类!!!

创建完成后:

以上就把基础的工程创建部分完成了,接下来就可以向其中添加我们实现功能的代码了。

三.功能实现

联系人类

person.cpp

#include "person.h"Person::Person()
{}Person::~Person()
{}void Person::SetPersonName(QString name)
{this->PersonName = name;
}
void Person::SetPhoneNumber(QString number)
{this->PhoneNumber = number;
}
QString Person::GetPersonName(void)
{return this->PersonName;
}
QString Person::GetPhoneNumber(void)
{return this->PhoneNumber;
}

person.h 

#ifndef PERSON_H
#define PERSON_H#include <QMainWindow>
#include <QObject>
#include <QWidget>class Person
{
private:QString PersonName;QString PhoneNumber;
public:Person();~Person();void SetPersonName(QString name);void SetPhoneNumber(QString number);QString GetPersonName(void);QString GetPhoneNumber(void);
};#endif // PERSON_H

        增删改查中围绕的最紧密的一个就是查,一旦实现了查,我们所有其他的功能便好实现了。为了实现查以及方便显示联系人,这里我选择了使用列表实现整个功能,选择列表的原因有以下:

  • 列表对频繁删改增添的功能实现很友好。
  • QT中列表方便显示

        所以这里我们创建一个联系人类的列表:

QList<Person> PersonList;//创建联系人列表

        后续的操作都将围绕这个列表进行。

        按照上面所说的我们优先实现查的功能。

        向findperson.cpp中添加相关头文件:

#include "QList"//列表容器
#include "person.h"//联系人类extern QList<Person> PersonList;//创建联系人列表

        双击dinperson.ui文件进入设计界面,设计UI如下:

        右键相关控件转到槽:

        在这个工程中我们基本只需呀用到按钮,所以选择按钮的clicked()槽函数;

查询按钮槽函数

void FindPerson::on_pushButton_find_clicked()
{if(ui->lineEdit_name->text().isEmpty() != true){QList<Person>::iterator it;for(it = PersonList.begin();it != PersonList.end();it ++){if(it->GetPersonName() == ui->lineEdit_name->text()){ui->label_number->setText(it->GetPhoneNumber());}}}
}

返回按钮槽函数

void FindPerson::on_pushButton_goback_clicked()
{this->close();
}

findperson.cpp:

#include "findperson.h"
#include "ui_findperson.h"
#include "QList"//列表容器
#include "person.h"//联系人类extern QList<Person> PersonList;//创建联系人列表FindPerson::FindPerson(QWidget *parent): QWidget(parent), ui(new Ui::FindPerson)
{ui->setupUi(this);
}FindPerson::~FindPerson()
{delete ui;
}void FindPerson::on_pushButton_goback_clicked()
{this->close();
}void FindPerson::on_pushButton_find_clicked()
{if(ui->lineEdit_name->text().isEmpty() != true){QList<Person>::iterator it;for(it = PersonList.begin();it != PersonList.end();it ++){if(it->GetPersonName() == ui->lineEdit_name->text()){ui->label_number->setText(it->GetPhoneNumber());}}}
}

        仿照查的写法:

addperson.cpp:

#include "addperson.h"
#include "ui_addperson.h"
#include "person.h"extern QList<Person> PersonList;AddPerson::AddPerson(QWidget *parent): QWidget(parent), ui(new Ui::AddPerson)
{ui->setupUi(this);
}AddPerson::~AddPerson()
{delete ui;
}//输入完成后
void AddPerson::on_pushButton_clicked()
{Person person_add;if(ui->lineEdit_name->text().isEmpty() != true && ui->lineEdit_number->text().isEmpty() != true){person_add.SetPersonName(ui->lineEdit_name->text());person_add.SetPhoneNumber(ui->lineEdit_number->text());PersonList.append(person_add);}ui->lineEdit_name->clear();//清空输入框ui->lineEdit_number->clear();this->close();
}

deleteperson.cpp:

#include "deleteperson.h"
#include "ui_deleteperson.h"
#include "QList"//列表容器
#include "person.h"//联系人类extern QList<Person> PersonList;//创建联系人列表DeletePerson::DeletePerson(QWidget *parent): QWidget(parent), ui(new Ui::DeletePerson)
{ui->setupUi(this);
}DeletePerson::~DeletePerson()
{delete ui;
}void DeletePerson::on_pushButton_clicked()
{if(ui->lineEdit_name->text().isEmpty() != true){//以下两种QList<Person>::iterator it;for(it = PersonList.begin();it != PersonList.end();){if(it->GetPersonName() == ui->lineEdit_name->text()){it = PersonList.erase(it);//删除该元素并返回修改后的迭代器}else{it++;}}// for(int i = 0;i < PersonList.size();)// {//     if(PersonList[i].GetPersonName() == ui->lineEdit_name->text())//     {//         PersonList.removeAt(i);//     }//     else//     {//         i++;//     }// }}this->close();
}

changeperson.cpp:

#include "changeperson.h"
#include "ui_changeperson.h"
#include "QList"//列表容器
#include "person.h"//联系人类extern QList<Person> PersonList;//创建联系人列表ChangePerson::ChangePerson(QWidget *parent): QWidget(parent), ui(new Ui::ChangePerson)
{ui->setupUi(this);
}ChangePerson::~ChangePerson()
{delete ui;
}void ChangePerson::on_pushButton_change_clicked()
{if(ui->lineEdit_previousName->text().isEmpty() != true){QList<Person>::iterator it;for(it = PersonList.begin();it != PersonList.end();it ++){if(it->GetPersonName() == ui->lineEdit_previousName->text()){//修改姓名if(ui->lineEdit_presentName->text().isEmpty() != true){it->SetPersonName(ui->lineEdit_presentName->text());}//修改电话if(ui->lineEdit_number->text().isEmpty() != true){it->SetPhoneNumber(ui->lineEdit_number->text());}}}}this->close();
}

!!显示!!

        这里由于我们选择使用列表来操作整个联系人数,所以这里的显示控件可以选择ListView,但笔者觉得TableView更方便对应操作,所以选择了TableView控件。QT中TableView进行填充数据时要创建一个模型,在模型总确定好各个参数后,再将模型填充到TableView控件中。这里可以了解下:

QT框架的核心特性之一——模型-视图编程范式(Model-View Programming)

        同时由于我们联系人类中只设置了两个私有属性,所以要进行分别填充。

displayperson.cpp:

#include "displayperson.h"
#include "ui_displayperson.h"
#include "QStandardItemModel"
#include "QTableView"
#include "person.h"extern QList<Person> PersonList;int ListCount = PersonList.count();//获取列表中元素的个数DisplayPerson::DisplayPerson(QWidget *parent): QDialog(parent), ui(new Ui::DisplayPerson)
{ui->setupUi(this);//由于这里使用的是TableView控件,所以要新建一个模型QStandardItemModel *model = new QStandardItemModel;model->setColumnCount(2);//列数model->setRowCount(ListCount);//行数ui->tableView->setModel(model);model->setHeaderData(0,Qt::Horizontal,"姓名");model->setHeaderData(1,Qt::Horizontal,"电话号码");int row = 0;QList<Person>::iterator it;for(it = PersonList.begin();it != PersonList.end();it++){QStandardItem *item1 = new QStandardItem(it->GetPersonName());QStandardItem *item2 = new QStandardItem(it->GetPhoneNumber());item1->setTextAlignment(Qt::AlignCenter);model->setItem(row,0,item1);model->setItem(row,1,item2);row ++;}
}DisplayPerson::~DisplayPerson()
{delete ui;
}void DisplayPerson::on_pushButton_clicked()
{this->close();
}

清除

        由于我们选择了列表进行数据操作,所以这步就十分简单,直接调用其成员函数即可。

clearperson.cpp: 

#include "clearperson.h"
#include "ui_clearperson.h"
#include "QList"//列表容器
#include "person.h"//联系人类extern QList<Person> PersonList;//创建联系人列表ClearPerson::ClearPerson(QWidget *parent): QWidget(parent), ui(new Ui::ClearPerson)
{ui->setupUi(this);
}ClearPerson::~ClearPerson()
{delete ui;
}void ClearPerson::on_pushButton_clicked()
{PersonList.clear();//清空联系人this->close();
}

!!主窗口!!

        为几个功能添加按钮即可,点击对应按钮就触发相应功能。

mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"#include "QList"//列表容器
#include "person.h"//联系人类QList<Person> PersonList;//创建联系人列表MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}//0.退出
void MainWindow::on_pushButton_7_clicked()
{this->close();
}//1.添加联系人
void MainWindow::on_pushButton_clicked()
{static AddPerson addui;addui.show();
}//2.显示联系人
void MainWindow::on_pushButton_2_clicked()
{//这里使用new创建的好处是关闭后自动销毁DisplayPerson *displayui = new DisplayPerson();displayui->show();
}//3.删除联系人
void MainWindow::on_pushButton_3_clicked()
{DeletePerson *deleteui = new DeletePerson();deleteui->show();
}//4.查询联系人
void MainWindow::on_pushButton_4_clicked()
{FindPerson *findui = new FindPerson();findui->show();
}//5.修改联系人
void MainWindow::on_pushButton_5_clicked()
{ChangePerson *changeui = new ChangePerson();changeui->show();
}//6.清空联系人
void MainWindow::on_pushButton_6_clicked()
{ClearPerson *clearui = new ClearPerson();clearui->show();
}void MainWindow::on_pushButton_author_clicked()
{Author *authorui = new Author();authorui->show();
}

mainwindow.h:

   要在mainwindow.h主窗口头文件中添加我们创建的所有类的头文件:

四.最终效果

主界面

添加联系人界面

显示联系人

查找联系人

修改联系人

删除联系人

五.总结

        总体来说这个项目难度不高,对于QT初学者来说练习巩固尚可,也是笔者初学QT独立完成的练习之作,希望对大家能够有所帮助!如有想要工程学习的可以访问我的gitee仓库进行克隆:

AddressBook: QT联系人管理系统


                                                                                                                       如有错误,感谢指正!

                                                                                                                                       2024.10.29

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

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

相关文章

一文详谈领域驱动设计实践

作者&#xff1a;泊静 阿里云开发者 导读 本文作者结合在团队的实践过程&#xff0c;分享了自己对领域驱动设计的一些思考。 了解过领域驱动设计的同学都知道&#xff0c;人们常常把领域驱动设计分为两部分&#xff1a;战术设计和战略设计。这两个概念本身都是抽象的&#xff…

单链表OJ思路

目录 前言 一、移除链表元素 二、反转链表 三、链表的中间结点 四、返回倒数第k个结点 五、合并两个有序链表 六、链表分割 七、链表的回文结构 八、相交链表 九、环形链表 十、环形链表|| 十一、随机链表的赋值 前言 11道单链表OJ题的解题思路。 一、移除链表元素 链接&#…

数据结构与算法——Java实现 54.力扣1008题——前序遍历构造二叉搜索树

不要谩骂以前的自己 他当时一个人站在雾里也很迷茫 ​​​​​​​ ​​​​​​​ ​​​​​​​—— 24.11.6 1008. 前序遍历构造二叉搜索树 给定一个整数数组&#xff0c;它表示BST(即 二叉搜索树 )的 先序遍历 &#xff0c;构造树并返回其根。 保证 对于给定…

【Qt聊天室客户端】单聊与群聊

1. 区分单聊和群聊 逻辑分析 具体实现逻辑 主窗口完善判断单聊还是群聊的逻辑 单聊会话详情入口中&#xff0c;设置头像和昵称 2. 删除好友 直接找到删除好友的按钮&#xff0c;然后实现其删除逻辑即可 具体实现 无法删除好友BUG处理 问题复现&#xff0c;点击好友删除后&…

1.集合体系补充(1)

1.接口式引用 集合的构造&#xff0c;我们需要采用接口类型引用的的方式&#xff0c;这样做的好处就是方便根据业务或者设计上的变化&#xff0c;快速更换具体的实现。 事实上&#xff0c;Java集合设计体系者也是支持我们这样做的&#xff0c;并且集合体系的设计也是如此的。 创…

枚举及优化(一)

第1题 百钱买百鸡 查看测评数据信息 百钱买百鸡问题&#xff1a;公鸡五文钱一只&#xff0c;母鸡三文钱一只&#xff0c;小鸡三只一文钱&#xff0c;用 100 文钱买 100只鸡&#xff0c;公鸡、母鸡、小鸡各买多少只&#xff1f;本程序要求解的问题是&#xff1a;给定一个正整…

自注意力机制

当输入一系列向量&#xff0c;想要考虑其中一个向量与其他向量之间的关系&#xff0c;决定这个向量最后的输出 任意两个向量之间的关系计算 计算其他向量对a1的关联性 多头注意力机制 图像也可以看成一系列的向量&#xff0c;交给自注意力机制处理&#xff0c;CNN是特殊的自注意…

RabbitMQ的死信队列

1.死信的概念 死信简单理解就是因为种种原因&#xff0c;无法被消费的消息. 有死信自然就有死信队列&#xff0c;消息再一个队列中编程死信之后&#xff0c;它能被重新发送到另一个交换器中&#xff0c;这个交换器就是DLX&#xff0c;绑定DLX的队列&#xff0c;就被称为死信队…

十六 MyBatis使用PageHelper

十六、MyBatis使用PageHelper 16.1 limit分页 mysql的limit后面两个数字&#xff1a; 第一个数字&#xff1a;startIndex&#xff08;起始下标。下标从0开始。&#xff09;第二个数字&#xff1a;pageSize&#xff08;每页显示的记录条数&#xff09; 假设已知页码pageNum&…

SpringBoot框架在共享汽车管理中的应用

3系统分析 3.1可行性分析 通过对本共享汽车管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本共享汽车管理系统采用SSM框架&#xff0c;JAVA作为开发语…

数字化转型助手 快鲸SCRM系统为企业营销赋能

内容概要 在当今这个快速变化的商业环境中&#xff0c;数字化转型已经成为企业生存与发展的关键要素。无论是零售、制造还是服务行业&#xff0c;企业都深刻意识到传统工作模式的局限性&#xff0c;必须借助先进的技术来优化运营和提升客户体验。快鲸SCRM系统就是这样一款数字…

ZooKeeper在kafka集群中有何作用

Zookeeper 存储的 Kafka 信息 &#xff08;1&#xff09;启动 Zookeeper 客户端。 bin/zkCli.sh &#xff08;2&#xff09;通过 ls 命令可以查看 kafka 相关信息。 [zk: localhost:2181(CONNECTED) 2] ls /kafkazk中有一个节点 consumers 这个里面&#xff0c;老版本0.9版…

Linux操作系统:学习进程_对进程概念的深入了解

目录 前言 开篇 一、进程概念 二、进程的描述与管理 1、如何描述与管理 2、Linux中的PCB-task_struct 3、对进程组织的理解 三、进程的属性 1、系统创建进程 2、查看进程 3、进程的标识符 4、退出进程 1>ctrlc 2>kill命令杀死进程 5、用户进程的创建方式…

Embedding 技术在推荐系统中的应用

参考自《深度学习推荐系统》——王喆&#xff0c;用于学习和记录。 介绍 Embedding&#xff0c;中文直译为“嵌入”&#xff0c;常被翻译为“向量化”或者“向量映射”。它的主要作用是将稀疏向量转换成稠密向量&#xff0c;便于上层深度神经网络处理。事实上&#xff0c;Emb…

Kafka面试题

1、kafka消息发送的流程&#xff1f; 在消息发送时涉及到了两个线程&#xff0c;main 线程 和 sender 线程 &#xff0c;在main线程里面创建了一个双端队列&#xff08;RecordAccumulator&#xff09; ,当双端队列里面的信息满足 一定的条件后&#xff0c; sender线程会拉取双端…

RabbitMQ延迟队列(重要)

RabbitMQ延迟队列 1、延迟队列1.1、延迟队列使用场景1.2、延迟队列实现原理 2、使用rabbitmq-delayed-message-exchange 延迟插件2.1、下载2.2、安装2.2.1、解压2.2.2、启用插件2.2.3、查询安装情况 2.4、示例2.4.1、RabbitConfig配置类&#xff08;关键代码&#xff09;2.4.2、…

机器学习—神经网络如何高效实现

深度学习研究人员能够扩展神经网络的原因之一&#xff0c;在过去的十年里建立了非常大的神经网络&#xff0c;是因为神经网络可以向量化&#xff0c;它们可以使用矩阵乘法非常有效的实现&#xff0c;事实证明&#xff0c;并行计算硬件&#xff0c;包括gpus&#xff0c;但也有一…

【数据集】【YOLO】【目标检测】水面船只识别数据集 9798 张,YOLO船只识别算法实战训练教程!

一、数据集介绍 【数据集】水面船只识别数据集 9798 张&#xff0c;目标检测&#xff0c;包含YOLO/VOC格式标注。 数据集中包含1种分类&#xff1a;{0: ship}&#xff0c;代表水面船只。 数据集来自国内外图片网站和视频截图&#xff1b; 可用于无人机船只检测、监控灯塔船…

斜坡函数功能块(支持正常停机和紧急停机切换)

1、CODESYS斜坡函数功能块 CODESYS斜坡函数功能块(ST源代码)_用plc难能写一个斜坡加减速度吗-CSDN博客文章浏览阅读1k次。本文介绍了如何在CODESYS平台上创建斜坡函数功能块(FC),用于PID闭环控制中的给定值平滑处理。通过ST源代码实现,详细步骤包括仿真测试、变量修改、FC…

渗透测试--web基础之windows(二):常用命令详解及病毒编写

声明&#xff1a;学习素材来自b站up【泷羽Sec】&#xff0c;侵删&#xff0c;若阅读过程中有相关方面的不足&#xff0c;还请指正&#xff0c;本文只做相关技术分享,切莫从事违法等相关行为&#xff0c;本人一律不承担一切后果 目录 一、常见端口对应的服务 二、 常见的cmd命…