基于C++实现(控制台+界面)通讯录管理系统

news2024/9/22 15:40:15

个人通讯录管理系统

问题描述:

主要内容

个人通讯录是记录了同学(包含一起上学的学校名称)、同事(包含共事的单位名称)、朋友(包含认识的地点)、亲戚(包含称呼)等与本人有关人员的数据集。

具体要求

  • 提供录入个人信息、修改个人信息(姓名和出生日期除外)、删除个人信息等编辑功能。
  • 提供按姓名查询个人信息的功能。
  • 提供查找在5天之内过生日的人员的信息,以便发出祝贺电话或 E-mail。
  • 按照姓名或出生日期排序,显示输出。
  • 统计在给定月份出生的人数,并显示输出。
  • 能列出全体人员的姓名、出生日期、电话和email地址。
  • 能分别列出同学、同事、朋友、亲戚的所有信息。
  • 用菜单形式提供程序的各种功能的选择。

系统设计

开发环境

  • 控制台版本:VS2015
  • Qt界面版本:Qt_5_6_0_MinGW_32bit

控制台版本与界面版本

程序共有两个版本,控制台版本和界面版本。在程序设计之初,我们为了由易到难循序渐进,我们先在控制台下实现通讯录的各个功能。在完成并完善了控制台下最初版本之后,再设计并实现最终的界面版本。

类体系设计

程序结构中以Person类为基类,以Relative、Friend、Colleague和Classmate为其派生类。程序通过生成这四个派生类的对象来存储通讯录联系人信息。基类Person类中包含了姓名、电话、地址等基本信息,每一个派生类各自增加了不同的数据成员以及相应返回其数据成员的成员函数。

程序中还定义了AddressBook类,这个类严格意义来说就是我们所理解的通讯录。其数据成员中包含了一个Person类型的指针数组。其成员函数共有七个,七个函数可对该Person类型指针数组进行操作,以完成题目所要求的添加联系人、删除联系人、显示所有联系人并排序等功能。

类体系设计框架如图。

类定义:(图片代码中有注释详细说明)

基类Person类:

数据成员:

成员函数:

派生类Relative:

派生类Colleague:

派生类Friend:

派生类Classmate:

通讯录类Addressbook:

头文件

Cpp文件

通讯录Addressbook类各部分功能:

输入联系人信息:

删除联系人:

对联系人进行排序:

保存到文件夹

读取文件

查找联系人

另外需要说明的是,控制台版本中基类Person类设为抽象类,函数Print、Print2为纯虚函数。(Print输出中文如“姓名、电话号码”等等,Print2则输出相应的具体成员信息) 四个派生类都有其版本的虚函数以满足输出不同信息的要求。

因为读写兼容性问题(二进制文本读写和虚函数似乎不兼容,这个问题我们一直未能解决。目前已将该情况向老师说明,但暂时还未得到解决)因此我们在控制台版本中继续采用抽象类以及虚函数,并将二进制文本读写改为文本读写。在界面版本中我们则放弃采用抽象类和虚函数,继续使用二进制文本读取。这样也是为了更多使用我们所学知识。

界面实现技术细节:

添加菜单:

一、添加 QToolButton 控件,清除text,icon 为空,设置属性 arrowType 为**DownArrow”” ,这样就变成一个倒三角形状。

二、弹出菜单

  • 添加菜单。
  • 设置样式。
  • 关联菜单信号和槽函数。

三、响应菜单选中信号(写槽函数)。

四、补充:弹出右键菜单。

  • 从指定控件的类派生出一个类,把这个控件提升为这个派生类。
  • 重写 contextMenuEvent ,在这里创建菜单和关联信号和槽函数。
  • 写对应槽函数。
重写界面边框

原理实际就是去掉边框,然后添加label 和 按钮控件手动模拟。

一、去掉系统默认边框的显示

二、界面布局

  • 左边添加一个 label 控件,去掉text,设置 pixmap 属性,来设置图片。
  • 中间放一个label空间,然后是3个按钮控件。
  • 设置对应的图片,这里用QSS样式设置。
  • QSS样式设置。

三、代码实现

  • 响应3个按钮点击信号,弹出菜单前面已经提到。

  • 按住标题移动功能,重写 mousePressEvent mouseReleaseEvent mouseMoveEvent 事件。

搜索功能,编辑框虚字提示

一、设置编辑框属性 placeholderText ,即可实现上面的虚字提示功能,(有输入虚字提示消失)。

二、搜索按钮 和 上面最小化 按钮 QSS设置一样。

ListWidget 控件自定义窗口

思路:

ListWidget 控件下的每一个 Item(QListWidgetItem)都可以看作一个窗口,只要把窗口设置成自定义的窗口即可。

  • 创建子窗口,关联子窗口和ListWidget,关联子窗口和父窗口的信号和槽函数。

  • 槽函数之删除子窗口。
    • 判断信号子窗口。
    • 使用 takeItem 来去除子窗口。

  • 一些函数。

TabWidget 控件

这里实际当按钮使用,使用TabWidget 方便创建多个按钮和响应时间。

一、QSS样式

二、添加槽函数 void MainWindow::on_tabWidget_currentChanged(int index)

ListItem子窗口

一、设置label 的图片 和 按钮的样式

二、移入显示按钮,移出隐藏按钮(重写 enterEvent leaveEvent)

三、弹出(创建)窗口

四、日期的计算和选择

五、双击显示详细信息

重写 ListItemForm 的 mouseDoubleClickEvent 事件即可(不是在主窗口的ListWidget响应双击事件)

窗口编辑和查看切换

一、编辑模式:

二、查看模式:

三、思路:

  • 通过 setEnabled 函数来设置是否可编辑。
  • 通过 setStyleSheet 函数来改变显示的样式。

  • 禁用控件之后,字体会变灰(包括上面的Tab控件也是这样来避免禁用后难看的问题)。通过 样式表里面的 color 属性来设置字体,避免字体变灰。
  • 编辑框边框隐藏。通过设置样式表里面border 属性大小为 0px 来隐藏边框
  • TabWidget 设置Tab按钮的样式。

  • DataWidget 控件,设置 上面的样式并没有 去除边框 和 黑色背景。所以使用一个label控件来显示查看模式,编辑模式才显示DataEdit控件。

弹出文件选择框:

EXE文件图标设置:

  • 把图标文件icon.ico复制到项目目录下
  • 在 .pro 文件以下一下语句

程序测试

界面设计细节(QT版本):

页面设计与基本功能如下:

主界面

添加菜单

搜索功能,编辑框虚字提醒:

搜索编辑框自动补全功能:

查看联系人详细信息:

编辑联系人信息:

生日选择:

查询最近生日与生日提醒:

生成祝贺文本:

使用说明

程序的使用:

由界面提示操作即可。

开发环境:

  • 控制台版本:VS2015
    • 如果使用低版本vs打开,请先设置项目的平台工具集属性
    • 设置方式
      • 项目–>属性–>常规–>平台工具集–>当前VS对应的那个选项
  • Qt界面版本:Qt_5_6_0_MinGW_32bit
    • 注意不是使用VS下的Qt插件,必须安装Qt5.6来打开项目,而不是用VS打开。
    • 注意,Qt项目的目录路径不能含有中文,有中文无法编译

收获体会及建议

收获

  • Qt编程学习和使用。
  • GUI编程的学习。
  • 小项目的开发经验。
  • 编程能力提高。
  • 资料查询能力提高。
  • Debug能力提高。
  • 团队合作经验增加。

建议

  • 定义类结构的时候,定义好接口就不要再改变,即使后面改变了,也应该再类内部改变实现,而不能改变接口的形式
    因为本次大作业是采用在控制台下实现基本功能,再转移到Qt上实现界面。所以,在控制台下设计的接口难免会不合适,这就导致需要修改参数类型等的问题。由于是直接改原函数的参数,并且调用的地方有多处,这就给修改带来了很大的麻烦。如果采用原来的调用不变,在类里面更改参数的实现,那么就可以直接改一处地方(类内部),而不需要寻找和修改所有调用的地方的参数,这样也许会导致程序的效率降低一些,但是这是值得的。
  • 查询文档,看博客的时候要仔细,读懂每一句话
    在Qt添加自定义列表(就是列表控件里面有按钮或其他控件,而不是默认的编辑框控件)的时候,在第一次查找到的关于自定义控件的资料里面已经提到了具体的实现细节。由于当时看不懂,并且没有仔细研究,跳过了那篇文档,导致了后面查找了大量的资料和其他东西。虽然其中也学到了一些知识,但是大部分都做了无用功。
  • 变量命名要有意义,风格一致,以提高代码可读性。
  • 先设计好整个程序的框架再编写代码。
  • 不要畏难,哪怕走弯路也是积累经验。。
  • 设计程序要由易到难循序渐进。
  • 从用户需求角度上设计程序。
  • 合理估算解决问题时间。

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

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

相关文章

国家级|加速科技成功入选国家级专精特新“小巨人”企业

9月6日,浙江省通过的第六批专精特新“小巨人”企业名单在省经济和信息化厅官网完成公示,经过严格评审,杭州加速科技有限公司正式获国家级专精特新“小巨人”企业认定。 专精特新”小巨人”企业具备专业化、精细化、特色化、新颖化特征&#x…

“我”变小了但更强了!英伟达发布最新大语言模型压缩技术,无损性能且提升数倍!

1. 摘要 英伟达研究团队提出了一份全面报告,详细介绍了如何使用剪枝和蒸馏技术将Llama 3.1 8B和Mistral NeMo 12B模型分别压缩至4B和8B参数。他们探索了两种不同的剪枝策略:深度剪枝和联合隐藏/注意力/MLP(宽度)剪枝。 研究人员…

Adoptium Temurin JDK 的下载

在当今的软件开发领域,Java 无疑是最受欢迎和广泛使用的编程语言之一。Java 开发工具包(JDK)是任何 Java 开发者不可或缺的工具,它提供了编译、调试和运行 Java 应用程序所需的所有工具和库。Eclipse Temurin 是一个流行的开源 JD…

网络药理学:分子动力学模拟入门、gromacs能量最小化

推荐视频 B站: 讲的都是有效的概论,其中关于分子动力学模拟归纳的三步挺有用的。 B站:也没有讲清楚关于分子对接后得到的文件该如何处理。 B站: 需要用的是autodock vina,而且走过一遍up主之前分子对接的视频才比较…

mysql笔记3(数据库、表和数据的基础操作)

文章目录 一、数据库的基础操作1. 显示所有的仓库(数据库)2. 创建数据库注意(命名规范): 3. 删除数据库4. 查看创建数据库的SQL5. 创建数据库时跟随字符编码6. 修改数据库的字符编码 二、表的基础操作1. 引入表的思维2. 引用数据库3. 查看该数据库下面的表4. 创建表…

终端安全如何防护?一文为你揭晓答案!

终端安全防护是确保组织内部网络及其连接设备免受威胁的关键措施。 以下是终端安全防护的一些核心方法: 1. 资产管理与识别 摸清家底:识别所有连接到网络的终端设备及其状态,包括硬件和软件配置。 资产分类:确定哪些资产最为关…

华三(H3C)HDM服务器硬件监控指标解读

在当今日益复杂的IT环境中,服务器的稳定运行对于保障业务的连续性至关重要。华三(H3C)作为知名的网络设备供应商,其HDM(Hardware Diagnostic Module)技术为服务器硬件的监控提供了强有力的支持。监控易作为…

如何使用SSHFS通过SSH挂载远程文件系统?

SHFS(SSH 文件系统)是一款功能强大的工具,它允许用户通过 SSH 挂载远程文件系统,从而提供一种安全便捷的方式来访问远程文件,就像访问本地文件一样。本文将引导您完成使用 SSHFS 挂载远程文件系统的过程,为…

【自动化与控制系统】SCI一区TOP神刊!最快19天accept、稳定检索!

期刊解析 🚩本 期 期 刊 看 点 🚩 国人发文占比第一,TOP刊 审稿友好,审稿速度快 自引率9.8% 今天小编带来计算机领域SCI快刊的解读! 如有相关领域作者有意投稿,可作为重点关注! 01 期刊信息…

pytlsd在Win10下编译与使用

下载pytlsd项目,GitHub - iago-suarez/pytlsd: Python transparent bindings for LSD (Line Segment Detector) CMake配置 Windows 10,Visual Studio 2019下编译 Release版本生成文件包括: 测试代码: # -*- coding: utf-8 -*- import cv2 import matplotlib.pyplot as p…

CATH数据库数据下载

CATH数据库提供了多种类型的数据供用户下载,涵盖了蛋白质的结构域分类、同源性分析、功能注释等方面。以下是CATH数据库提供的一些主要数据类型及其解释: http://www.cathdb.info/download 1. 分类数据(Classification Data) 文件:如cath-domain-list.txt内容:包含CATH数…

jvm的各种性能检测工具

1: jvm 的性能诊断工具 1.1.:Jstat 这个的全称是JVM Statistics Monitoring Tool,说白了就是统计jvm的各种指标的,我们这边主要关注内存使用指标,一般我们后面要跟上pid的进程 jstat -gc pid jstat -gcutil pid最终的这些结果命…

教师节特辑:AI绘制的卡通人物,致敬最可爱的人‍

【编号:9】教师节到了,今天我要分享一组由AI绘制的教师节主题卡通人物插画,每一幅都充满了对老师的敬意和爱戴。让我们一起用这些可爱的卡通形象,向辛勤的园丁们致敬! 🎓【教师形象】 这…

ES6标准-【一】【学习ES6看这一篇就够了!!】

目录 顶层对象的属性 ES5中的顶层对象 ES6中的顶层对象 数组的解构赋值 默认值 对象的解构赋值 默认值 注意点: 字符串的解构赋值 数值和布尔值的解构赋值 函数参数的解构赋值 ES6中的圆括号问题 不能使用圆括号的情况 变量声明语句 函数参数 赋值语…

【JS】深拷贝与浅拷贝

深拷贝与浅拷贝 浅拷贝实现浅拷贝的方法扩展运算符 深拷贝实现深拷贝的方法递归JSON.parse(JSON.stringify()) 深拷贝和浅拷贝都是处理对象或数据的复制操作 浅拷贝 浅拷贝创建一个的对象,复制的是原对象的引用新对象与原对象共用一个相同的内存地址,因…

分布式算法-Paxos、Raft、ZAB复习

目录 1. Paxos算法 1.1 算法流程 1.2 接受者选举规则 2. Raft算法 2.1 Leader选举 2.2 安全性 3. ZAB算法 3.1 ZAB协议介绍 3.2 消息广播 3.3 崩溃恢复 3.4 数据同步 1. Paxos算法 Paxos 算法是 Leslie Lamport 在 1990 年提出的,经典且完备的分布式一致…

docker的镜像制作

镜像的加载原理 docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS UnionFS(联合文件系统): Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改…

Delphi 12.1安卓APP开发中获取硬件信息及手机号

Demo与代码已上传到CSDN下载。 这里简单说一下代码内容,完整代码请自行下载,不清楚的欢迎留言交流。 前言 演示Demo使用了我自己开发的一个控件,TLayoutPro 《Delphi D10.3 LayoutsPro 控件简介 -避免输入焦点被虚拟键盘遮挡》请查看并下载控…

第三部分:3---环境变量

目录 什么是环境变量? PATH环境变量: 临时修改环境变量PATH: HOME环境变量: 可能使用环境变量的场景: 进程和环境变量的关系: 环境变量相关操作: 代码获取环境变量: 主函数传…

百度静态资源瓦片nginx直接显示完整案例

案例地址:https://download.csdn.net/download/jinhuding/89733763 访问显示效果:(根据瓦片地址直接显示) http://172.16.39.203:8099/tiles/