需求分析
本次开发将实现一个物资交换软件,具有以下基本功能:
-
该程序允许添加物品的信息,删除物品的信息,显示物品列表,也允许查找物品的信息
-
物品有公共的信息(物品名称,物品说明,物品所在地址,联系人手机,邮箱)。为了便于管理和查询,物品可以分成不同的类别(例如食品、书籍、工具等),不同类别的物品可能有不同的属性(例如食品有保质期,数量;书籍有作者,出版社等)。
-
互帮互助系统有两种类型的用户:管理员和普通用户。
- 管理员可以设置新的物品类型(定义物品类型的名称和各个属性),修改物品类型。
- 普通用户在添加物品时先选择物品类型,然后再填入物品信息。普通用户搜寻物品时,需要先选择类型,再输入关键字,关键字可以再用户名称和说明中进行匹配。
普通用户需要注册(填入基本信息,包括住址,联系方式等),管理员批准后才能成为正式用户。
-
为了便于使用上述功能,软件需要提供GUI。
指定开发计划
开发共分为两个阶段,第一阶段实现基本功能;第二阶段实现进阶功能。
基本功能开发规划
- 开发语言选择:python
- 数据库实现:MongoDB
- 物品信息数据库(物品名称,物品说明,WANTS, 联系人手机,邮箱)
- 人机交互界面设计:PyQt
使用上述开发环境与工具实现基本的物品管理功能(添加,删除,显示与查找)
进阶功能开发规划
- 需要添加的新数据库:
- 用户基本信息数据库(用户名,密码,手机,邮箱,住址)
- 物品信息数据库(物品名称,物品说明,物品所在地址,联系人手机,邮箱,类型,详细信息)
- 需要更新的窗口:
- 主窗口 ---- 文本框:关键字(模糊查询)---- 按钮:只给管理员显示的管理按钮
- 物品添加窗口 ---- 文本框:名称,详细信息(同步更新问题),物品说明
- 需要添加的窗口:
- 用户登陆窗口 ---- 文本框:用户名,密码 ---- 按钮:登陆,注册
- 用户注册窗口 ---- 文本框:用户名,密码,确认密码,手机,邮箱,住址 ---- 按钮:确定,取消
- 管理员编辑窗口 ---- 文本框:物品详细信息种类,添加的新类型 ---- 按钮:添加新类型,通过用户请求
任务流程:
- 增加用户数据库,新建用户登录(出错提示)与注册窗口(出错提示),主窗口添加当前登录用户的基本信息
- 增加管理员编辑窗口,完善相关管理功能(前提要更新物品信息数据库)
- 更新物品信息显示窗口,添加详细信息显示窗口,更新物品添加窗口,更新物品删除判定
- 完善关键字查询功能
开发经验汇总
-
使用控制类实现多窗口协同控制
本次开发过程中,最大的一个困难就是多窗口协同工作。
以最基础的物品信息上传功能为例,用户需要在弹出的界面完成新物品信息的输入。在信息输入完成后,需要用户通过确定按钮完成信息的上传。
- 方案一:多线程
在开发初期的设计中,每个窗口按钮槽函数的设置局限在自己的类中,也就是所说的边界类的操作实现中。这样带来的问题便是,当上传窗口的“确定上传”事件触发时,对应的槽函数由于是在边界类中实现,只能操作自己窗口中的元素,不能同时操作其余窗口的元素。为了解决这个棘手的问题,最初采用的方案是使用多线程实现。主窗口每产生一个需要其余窗口合作的操作请求,便开启一个对应的监视线程。由于线程函数可以作为全局函数实现,所以通过在子窗口类的操作中引入全局变量,实现与线程函数的通信,从而能够在子窗口“确定上传”事件触发后,通过监视线程将信息传递到主窗口,完成主窗口相关变量的更新。
如此操作浪费资源,需要线程函数的不断监视子窗口的活动状态且实现代码繁琐冗长,于是在之后的开发中使用新的实现思路。
- 方案二:单独的控制类
使用一个专门的控制类实现主窗口和所有子窗口按钮的槽函数,控制类属性为各个窗口边界类的实例对象。这样由于窗口是作为属性在控制类中存在,在进一步设计其槽函数时,便可以控制全部窗口的内部属性从而替代了上述繁琐的实现方案。
-
使用Qt Designer开发将人机交互界面的功能与布局设计分离
采用Qt Designer使用现有的人机界面设计软件,通过可视化的界面设计生成
.ui
文件,之后采用自动代码生成对应的.py
文件。这样可以将人机界面布局设计与功能分离,从而提高功能代码的可重用性。
项目代码
该项目代码开源在本人Github的 Goods-Exchanging 上。
标签:Good,窗口,浅谈,信息,----,物品,添加,按钮,Exchanging From: https://www.cnblogs.com/sosoeeee/p/17017462.html