0 小组成员
马帅 / 2017202110248
齐爽爽 / 2017282110258
1 项目 GitHub 地址
GitHub:https://github.com/whumashuai/QTcalgen
2 预估耗时与实际耗时
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 5 |
· Estimate | · 估计这个任务需要多少时间 | 10 | 5 |
Development | 开发 | 1060 | 1160 |
· Analysis | · 需求分析 (包括学习新技术) | 30 | 120 |
· Design Spec | · 生成设计文档 | 10 | 30 |
· Design Review | · 设计复审 (和同事审核设计文档) | 30 | 60 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 60 |
· Design | · 具体设计 | 60 | 70 |
· Coding | · 具体编码 | 600 | 600 |
· Code Review | · 代码复审 | 180 | 180 |
· Test | · 测试(自我测试,修改代码,提交修改) | 120 | 40 |
Reporting | 报告 | 90 | 180 |
· Test Report | · 测试报告 | 50 | 130 |
· Size Measurement | · 计算工作量 | 20 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 30 |
合计 | 1160 | 1345 |
3 解题思路
3.1 前期准备
因为我的partner马帅第二次完成的比我好,所以我们决定第三次作业,在他的代码基础上进行改进与升级,在这个基础上建立前台交互界面。在之前,项目只有math.h和calgen.cpp两个文件。我们意识到要实现接下来的功能,我们必须分模块,将代码分装。当拿到需求,需要建立前台界面,我们小组就很惆怅,因为C++在自己的印象中,C++是需要自己写很多东西的,但是吧又一想,现在发展的多块啊,肯定什么东西网上都已经实现了。于是就搜索,直接出来的QT,于是就确定下来,咱们用QT!简单粗暴。
3.2 前端
使用QT disigner设计简单界面;参考博客等等等。
实现功能:
(1)多语言:虽然一开始就看到老师要求,不是简单的if、else而是要体现低耦合。也看了博客其他人的解决办法,似乎他们都觉得这个功能很难实现。或许是我们第一次使用QT,很多东西都第一次知道,在知道有信号与槽的功能后,我们很兴奋,觉得这个好像框架,直接用就OK。但是在最后整理反思的时候,我们还是建立了不同语言的界面,在用户选择语言后,后台接收到不同信号,从而反馈不同的语言界面,似乎和if、else相仿。
(2)计时,实现比较容易,使用QTime类实例化一个对象,然后加一个信号与槽作为每秒更新,然后调用start和stop函数控制开始与结束即可。
3.3后端
使用马帅的代码,在原来基础上分装、修改。
3.4 流程图
3.5 分歧解决
我们两个都是比较好商量事情的人,所以任何一方提出一个问题,基本都是赞同的,所以没有分歧。尽管最后觉得页面很简陋,并且也有点不符合平时用户的习惯,但是在最开始,只想先实现每一个功能,最后再来修改,总觉得时间还够,以至于后面也来不及修改。包括前期,达成一致,先实现计时和多语言,后面再增加计数功能,发现也来不及了。
4 代码说明
因为关键代码基本和上次的差不多,就展示新加入的关键代码。
(1)多语言选择功能:语言切换功能通过信号与槽机制实现,在主界面(w表示),发送信号signaltra(),signalsim(),signalEng()分别由繁体,简体,英文界面的receiveshow()槽接受以显示该界面。具体代码如下:
QObject::connect(&w,SIGNAL(signaltra()),&tn,SLOT(receiveshow())); QObject::connect(&tn,SIGNAL(tranumshowmain()),&w,SLOT(receivereturn())); QObject::connect(&tn,SIGNAL(trashow()),&t,SLOT(receiveshow())); QObject::connect(&t,SIGNAL(trashownum()),&tn,SLOT(receivereturn())); QObject::connect(&w,SIGNAL(quit()),&a,SLOT(quit())); QObject::connect(&t,SIGNAL(quit()),&a,SLOT(quit())); QObject::connect(&w,SIGNAL(signalsim()),&sn,SLOT(receiveshow())); QObject::connect(&sn,SIGNAL(simnumshowmain()),&w,SLOT(receivereturn())); QObject::connect(&sn,SIGNAL(simshow()),&s,SLOT(receiveshow())); QObject::connect(&s,SIGNAL(simshownum()),&sn,SLOT(receivereturn())); QObject::connect(&w,SIGNAL(quit()),&a,SLOT(quit())); QObject::connect(&s,SIGNAL(quit()),&a,SLOT(quit())); QObject::connect(&w,SIGNAL(signalEng()),&en,SLOT(receiveshow())); QObject::connect(&en,SIGNAL(engnumshowmain()),&w,SLOT(receivereturn())); QObject::connect(&en,SIGNAL(engshow()),&e,SLOT(receiveshow())); QObject::connect(&e,SIGNAL(engshownum()),&en,SLOT(receivereturn())); QObject::connect(&w,SIGNAL(quit()),&a,SLOT(quit())); QObject::connect(&e,SIGNAL(quit()),&a,SLOT(quit()));
(2)计时:在界面添加LCDnumber控件,使用QTimer类实例化一个时钟对象,用start和stop函数控制时钟的开始与暂停并给一个信号给timeUpdate开始时间的计时。使用QTime类实例化一个时间对象,初试化时间为0,调用addSecs函数并赋值参数为1,表示计时操作增加一秒,然后给出具体的输出形式(如“hh:mm:ss”),调用LCDnumber控件的display函数显示出计时。
.h文件
QTimer *engtimer; QTime *engTimeRecord;//record time
.cpp文件
engtimer = new QTimer(this);//new Timer() engTimeRecord =new QTime(0,0,0); QObject::connect(engtimer,SIGNAL(timeout()),this,SLOT(timeUpdate()));
timeUpdate()函数
*engTimeRecord = engTimeRecord->addSecs(1); QString strTime = engTimeRecord->toString("hh:mm:ss"); ui->lcdNumber->display(strTime);
5 测试运行
由于后台代码没有怎么改动,所以单元测试用例情况和第二次相同。以下页面为进入之后每一步操作流程的页面。
模拟用户正确操作
(1)语言选择
后面以中文简体为例。
(2)自主选择表达式数量
(3)做题页面
当进入页面开始计时,中间反馈框会反馈正确性与正确答案。当做到最后一题时,显示得分与总耗时。
用户可能的错误操作及应对
除了表达式数量框与结果框,其他显示框,限制只能显示。
6 合作与总结
马帅
这是我第一次接触到结对编程,确实不知道如何去分配任务,还要考虑编程的方式,编程环境等,刚开始觉得很麻烦,慢慢接触后,和partner一起交流学习,碰到问题一起解决。帮助修改代码,效率大大提高,代码的质量也提高不少。
本项目需要一个UI界面,由于使用的是C++编写该项目,也一直没用过C++写界面,在网上查找一些资料后,并且和partner商议后决定采用QT实现。由于第一次使用QT也确实遇到了一些问题,最开始是QT运行环境的问题,这个问题困扰了很久,也导致项目进展不顺,后来还是和partner交流过程中提到这个问题,在partner的帮助下终于解决了这个问题。后来在项目的编写过程中也遇到了一些问题,比如在多项目文件中使用全局变量,采用extern关键字来实现,但一直无法再其他文件中使用,在CSDN上查找N篇博客后依然没解决,后来和partner交流后再知道是我自己声明出错。在实现时钟的过程中,获取时钟显示值一直为0,在网上查找相关的一些资料后采用QTime的实例对象调用addSecs函数去刷新时钟,停止后直接把该实例按照“hh:mm:ss"表示为QString类型显示出来。等等。
本次项目让我学到了很多,不但学习到了如何用QT对编写UI,更重要是学到如何和partner合作编程,去处理合作过程中出现的各种各样的问题。以后我会和partner继续合作,共同学习,提高自己的能力。
齐爽爽
很荣幸能在这次课上有结对编程的体验,也能有一个好的partner,合作至今,并没有出现老师之前提到的合作中的问题。1+1确实大于2,特别是对于我这种选择困难,并且也不知道到底怎么解决问题的人来说,有一个和你一起的小伙伴,多一个人可以交流,有什么想法都能立马说出来,不管最后我们达成的共识是否正确,但是至少能得到小伙伴的肯定还在赞同,还是能在项目里树立信心的。并且在结对编程中,有一个人在那里监督,少了懒散,并且有问题也能及时指出,提高效率。但是在这中间,肯定也会有不足,我和小伙伴的合作,正是我俩都是那种太好相处的伙伴,所以很多问题上面很容易就满足,没有过高要求自己,所以和其他团队的项目比起来会显得简陋。但是不管最后结果如何,这个合作过程是不可替代的。
7 结对照片
虽然一个在街道口一个在工学部,但是还是碰了三次面的,中间一些卡着的问题的解决。到最后一次才想起来拍照。