一、基本信息
名称:通讯录管理系统
所用时间:6周
产品:
图1资源管理器显示(详细模式、平铺模式)
图2主要界面
图3主要功能(更新、增加、删除、查找)
图4设置功能
图5帮助和关于
二、好的计划意味着成功了80%
从日常作业到期末考核,所做过的项目,大多一两人就能完成,而且是想到什么做什么,没有什么计划性。即便在教学计划中有“需求分析”、“概要设计”这样的安排,大多也是应付了事。偶尔有认真完成的,在项目实际开始后,便又抛之脑后,没有什么作用。更甚的是,即便如此,大家也都还能按要求完成项目——虽然质量参差,但总不至于挂科。如此,大家更忽略了计划这一步骤。
本项目开始时,正是由于这个原因,简单的分配了下任务,就直接进入到编码阶段。常常是写着写着就忘了前面,然后翻回去找又发觉很乱,改着改着就乱掉了。于是前2周内基本就处于“编码——调试——不满意——烦躁的改BUG——推翻重来”这样一种循环状态中。大小事情总需要互相联系修改,甚至部分地方做完之后才发现冲突,而且各个模块的借口也纠葛了很久。换言之,前2周基本没有任何进展,唯一的收获就是我们对于项目有了一个大概而粗浅的认识。
N次推翻重来之后,大家觉得不能再这样了——否则肯定要挂掉的。在意识到这个问题之后,我们停下来,用一周的时间反复开会讨论,最终形成了项目计划书。在计划书中,我们确定了产品所需功能,用户界面模型,数据库组织方式,多模块接口方式等内容,并确定了项目开发时间表。
在接下来的3周里,我们按照计划按部就班的进行着。接下来的事情就很顺利了。有什么不明的地方,看看计划书就能找到规定。如何实现,有什么方法等等全部都在计划书中可以找到。除了定期交换进度外,基本不需要额外的联系。这样下来,我们最终弥补了前2周的损失,赶在截止日期前完成了整个项目。
现在看来,这其中还是有一些不足。项目计划未对编码规范进行定义。关于代码风格,变量命名方式等也应该在这一时期进行定义,以便于后期调试。
【总结】
项目的第一步应对项目内容,时间安排、人员安排制定计划。各种可以预见的问题应当在此阶段解决。计划制定后不轻易修改。宁可多花些时间做计划,不在项目开始后修改。
项目开始前应当保证每位成员对项目有总体认识,对各自负责部分有详细认识。
三、项目要点
(项目开发环境为Windows 7 + Qt 4.7.0,开发工具为Qt Creator 2.0.1,数据库链接方式使用Qt内置SQLite驱动。)
(一)为可执行程序添加图标(如图1)
将.ico图标文件放在项目路径下,并于项目路径下创建与图标文件同名.rc资源文件,其内容为IDI_ICON1 ICON DISCARDABLE "icon_name.ico"。随后在.pro项目文件中添加RC_FILE = icon_name.rc。构建即可。
(二)窗口间信息传递
使用全局变量。关键字extern。
(三)中/英文判断
Qt使用Unicode编码,汉字区间为\一–\龥。一般由对话框读取到的数据皆为QString类型,可首先转换为QChar类型,进而通过QChar类的unicode()方法获取编码值来判定。
(四)汉字拼音排序
由于Unicode编码中的汉字顺序不是拼音顺序,因此按照编码值是无法实现比较的。最终自己做了一个汉字——拼音映射表来实现此功能。
汉字——拼音映射表
从左至右依次为该组汉字首字权重、该组汉字总字数、该组汉字拼音首字母、汉字组。
组内的其他汉字权重定义为首字权重 + 该字在组内的序号。如:阿3000001000、啊3000001001……这样每个汉字都将有一个唯一的权重值,依此权重值来实现汉字的拼音排序。
单字权使用10位数字来表示,且以3开头。这样在将a-z 26个英文字母权重定义为1-26的前提下,即可实现与最长5位英文串混合排序的功能。
(五)输入框嵌入工具栏
使用Qt Creator可视化编辑无法将输入框放置于工具栏上。必须编辑源文件通过代码放置。
四、其他细节要点
(一)源文件(.cpp)与头文件(.h)
Qt能够通过向导自动生成对话框,并创建相应的头文件与源文件。当对话框很多之后,包含关系往往是“你中有我,我中有你”,一不小心就会导致循环包含的问题。我就为此头疼了好一阵。出现循环包含的症状是:明明incl?了所需头文件,编译器却提示未定义错误。
建议:include语句尽可能放在源文件中。头文件尽可能只做相应源文件所需的声明。
五、存在的问题
(一)Qt中的数据库
最初试图将所有涉及到数据库的操作封装成一个类,通过创建对象,调用对象方法,来实现所需操作。但是这样的话操作结果难以返回给调用段,最终未能克服此问题,涉及到返回的操作未进行封装。
调用方式上,最初是用时创建,问题是会导致大量重复定义和链接未释放问题。还会引起操作结果被错误丢弃的问题。最终将类对象定义为全局变量的解决办法。不过这一办法唯一的不完美地方就是在程序运行结束时会产生一个链接未释放的Warning。
(二)中/英文判断
参见 三(三)。使用正则表达式可以简化判断。不过很遗憾我不太会用。
(三)设置保存
因为项目中有设置功能,因此使用了一个文件来保存这些设置,并编写了保存设置与读取设置的代码。后来发现Qt似乎提供了相关类来实现这些功能,有待研究。
(四)数据库更新
程序通过创建新文件并覆盖原文件的方法来实现更新。后来老师批评我这样做风险很大。嗯,应该改改。
(五)事件过滤器
目的是实现输入框在有预置内容的情况下,点击输入框,自动清除预置内容的功能。不过不完美,点击之后无法显示光标。最终去除了这一功能,在主界面(图2)上已无法看到。
(六)TableView的大小
目前尚未实现TableView大小随窗口大小自动调整的功能。据悉使用布局管理器可以解决。有待尝试。
(七)汉字拼音排序
参见 三(四)。寻求更加简单易行的方法。
(八)对话框右上角【?】按钮
部分窗口右上角【?】按钮去掉后会报错,因此未能全部去除。待解决。