西北农林科技大学 信息工程学院
面向对象生成图表系统实习报告
学 号 姓 名 专业班级 指导教师 完成日期
2009012911 石海龙 信管093 胡少军 2012.01.12
目录
一、综合训练目的与要求 ............................................ 3 二、综合训练任务 ........................................................ 3 三、总体设计 ................................................................ 3 四、详细设计说明 ........................................................ 4 五、调试与测试 ............................................................ 5 六、实习日志 ................................................................ 7 七、实习总结 ................................................................ 8 八、附录:核心代码清单 ............................................ 9
2
一、综合训练目的与要求
1.综合训练目的:
1).掌握基本的基础知识,并了解基本的软件开发过程。 2). 巩固自己所学的知识。 3). 学会团队合作。
4).掌握界面设计的基本知识。
2.综合训练要求:
1)用面向对象的思想完成自己所选择的题目。 2)要达到题目要求的效果。
3).严格按照开发软件过程执行每天的任务。 4).撰写好相关的文档。
二、综合训练任务
这次实习任务的题目是面向对象图表生成,主要效果就是出现Excel之中能对输入一些数字,然后插入图表之后生成各种不同的图标,具体有饼状图,折线图,柱状图三中图标的生成,对于折线图和柱状图不需要区别,直接就可以看出每个输入对应的点,而对于饼状图要区分,填充不同的颜色加以区别。对于数据的读取,我们是采取文件读取,然后对数据进行处理,至于如何处理我们都是把处理函数以及功能封装起来,用户不用清楚过程,这样比较的符合大多人的习惯,这样开发出来的软件才具有普遍性和实用性。 对于框架的设计,我们采用一个基类,派生出三个不同的绘图类,折线类,饼状类,柱状类,然后各自实现绘图功能,对于绘图的数据,则采用文本读取,传入参数。最后我们做出的效果应该是生成一个界面,任意输入不同的数据,从文件之中读取,然后点击上面相关的按钮,可以任意触发所要的类型。 上面的描述使我们小组最终完成的成果,我的任务就是实现事件的驱动,已经界面设计,对于事件的驱动,需要设计不同的驱动函数,来实现用户想要选择的成图的效果。
三、总体设计
以下是总体设计流程图
3
开始绘图基类派生柱状类派生折线类派生饼状类数据处理文本数据读取具体柱状类实现柱状图具体折线图实现折线图具体柱状类实现饼状图事件驱动
说明:先设计一个基类,然后派生三个类,最后设计事件驱动,用来读取文本数据和生成具体的图形。
四、详细设计说明
以下是我负责的功能模块的详细设计说明:
1、界面设计:
这个比较的简单,和其他的开发工具一样,界面设置可以利用里面的一些面板或者按钮,直接用鼠标就可以,根据自己的需要合理安排布局。 2、驱动事件: 1)、驱动文件读取:public slots: void openFile();
我们这次系统设计数据来源主要是文件读取,要对文件数据进行读取处理,我们就要获得文件名称,然后才能进行参数传递以及数据处理,在QT之中有QFileDialog::getOpenFileName这个函数功能可以获得文件的名称,然后在调入DealFile()函数之中,对文件里面的内容进行处理,由于文件内容是以字符形式读入的,所以要转换成相对应的整数,才能作为参数传给各个绘图函数所需要的参数,
4
读出里面的数据,加入到缓冲区,保存起来。(利用容器(vector)),所以设计一个文件菜单,包括打开合关闭,在按钮属性里面给各自的Sender,Signal,Slot ,Receiver,设置之后利用函数:
connect(this->ui->action,SIGNAL(triggered()),this,SLOT(openFile()));就可以达以浏览文件的方式,获取数据。 2)、驱动文件关闭:
直接在面板上按钮属性设置Sender:action2,Signal:triggered(),Receiver:MainWindow Slot:close(); 3)、驱动生成折线图:
用同样的方法给类型菜单里面的折线图按钮设置Sender,Signal,Slot Receiver,用connect(this->ui->action,SIGNAL(triggered()),this,SLOT(showline ()))就可以以动作按钮的方式,来在面板上显示折线图。 4)、驱动生成饼状图:
用同样的方法给类型菜单里面的折线图按钮设置Sender,Signal,Slot,Receiver,用connect(this->ui->action,SIGNAL(triggered()),this,SLOT(showhistogram ()))就可以以动作按钮的方式,来在面板上显示柱状图。 5)、驱动生成柱状图:
用同样的方法给类型菜单里面的折线图按钮设置Sender,Signal,Slot,Receiver,用connect(this->ui->action,SIGNAL(triggered()),this,SLOT(showpie ()))就可以以动作按钮的方式,来在面板上显示柱状图。
五、调试与测试
1.界面启动,单击运行之后,弹出如下图示窗口
2.浏览文件测试,单击打开效果如下:
5
3.折线图测试,在导入要读入的数据之后,再单击类型之中的折线图,呈现效果
如下:
4.柱状图测试:点击柱状图之后效果如下:
6
5.饼状图测试:单击饼状图之后效果如下:
六、实习日志
2011年12月31号
今天是实习的第一天,在昨天选好题目之后,今天我们在老师的指导之下,对实习内容有所了解,也对实现它有了一个大致的了解,由于要用QT或者MFC实现,这对我们来说有点难度,这些知识之前只是听说一下, 很少用到,心里还是很没底……
2012年1月3号:
今天是第二天,再通过放假两天的学习,我们基本上了解了相关的知识,在和小组成员讨论之后,我们确定了基本的框架,和各自的任务,我的任务就是点击按钮进行事件驱动和相关的界面设计,以及文件的读取。
2012年1月4号:
今天就是了解一下绘图所要的参数,以及出来的效果,只是简单的调用绘图函数,然后了解他们具体的作用,为我们框架参数提供依据,这样好以后便于修改,由于是QT,不是很熟悉,途中遇到很多的问题,我们一边参考网上的资料,以及请教一些同学,了解的还是蛮快的。
2012年1月5号:
今天我实现了文件的读取以及相应的参数的类型的转换,一开始是用C++实现的,感觉判断这些挺麻烦的,就了解了一下关于QT的读取文件,很是简单,所以之前写的就废了,不过还是很有收获,巩固了一下以前的知识,以及学习到一些新的东西。
2012年1月6号:
今天我做的关于事件驱动的实现,利用QT信号以及槽来实现的,这个过程之中遇到的麻烦很多,问题也很多,老师对于QT不是很清楚,所以就是自己查资料问之前学过QT的同学,效果很好,懂得了驱动函数的用法,这对于后面的要驱动生成具体的图表意义很大。
2012年1月8号:
经过几天的构想思考,我们的框架效果终于好了,并且能够出来我们预想的结果,这个
7
让我们感到很是轻松,具体的就是实现美化工作了,这个是细节问题,对于我而言,我很想锻炼一下自己的,让自己变得细心。
2012年1月9号:
由于晚上考试,同学们很是紧张,就干脆直接带着课本复习了,谁都知道考试前几个小时意味着什么,对于大学考试来说真的是很重要,幸好老师也是很理解我们,今天实习期间就让我们复习了。
2012年1月10号:
本以为我们的程序设计已经很好了,原来我们只是根据自己的意愿在那里用自己的方法实现东西,经过老师的考察之后,我们程序设计的缺陷很多,这让我们有点惭愧,我们商量之后,觉得今天晚上通宵。
2012年1月11号:
经过昨天晚上的通宵,我们的程序实现的功能达到了老师的要求,今天的任务就是撰写文档,为明天的答辩做好准备,有点紧张,不过也很高兴,可以回家了。
2012年1月12号:
今天是实习的最后一天,任务虽不多,但是有点紧张,就是答辩,老师检查我们的成果。我大概天生就有点紧张,并且我看到我组员也是比较的紧张,虽然我们的任务都符合了老师的要求了,但是老师问的问题回答的不是很好,心里有点懊悔和紧张,不管怎么说,放假了,这很好。
七、实习总结
这次我们实习任务是面向对象生成图表系统,对于我们之前一直使用微软的Excel,对于输入数据如何生成图标从来不关心,只需要如何使用它就好了,在选择实习题目之前,一开始打算选一个之前比较熟悉的管理系统,但是同组的说是感觉能生成为人所作的东西很是神奇,在经过商量之后就决定选择了这个题目作为我们这次的实习任务,一开始心里没有一点思路,因为之前就没了解过这种东西,所以选择了这个陌生的题目感觉压力比较得大。 在刚开始的时候,确实和刚开始的感觉一样,感觉什么也不会,毕竟有些东西是新的,学起来比较的困难,没有老师的指导,但这个方面也可以锻炼我们以后工作之后独立工作和学习,想到这一点,心里感觉踏实多了。
在这次实习的期间,遇到最大的困难还是框架的构建,这是我们参考资料以及共同商量之后才决定的。在我做的这部分之中,有界面的设计,以及文件的读取,数据的转换,还有事件的触发,这其中最难的还是触发这一部分,虽然自己在这一方面单独触发简单的比较的容易,但是要触发同伴写的东西,这个毕竟不是自己写的,所以在写自己的之前,必须要了解同伴所写的,以及如何实现的,这个是比较的困难,不过我们最后还是成功了,这方面的成功,收获意义重大。 这次实习学到很多的东西,和同学合作,锻炼自己的细心程度,提高自己学习的能力,巩固已经学的知识。虽然这次合作过程之中有很多的分歧,但是我知道大家的目标都是一样的,分歧时难免的,但是合作才是通向成功的道路。有一点我们很是清楚,在刚开始的时候,我们选择的开发工具不一样,这个让老师很生气,我们是一个团队,竟然连最基本的都统一不了,那以后在工作的时候,怎么和更多的人合作呢?在实现有关的功能过程之中,基本的数据,还有思想都是正确的,但是关于小的知识,尤其是边界问题,这个事比较的难考虑,
8
在整个过程之中,你一定考虑周全,考虑细致,失败的越多,只能说明你掌握的知识很少,但是如果在整个过程之中,你能修改正确,你的知识就增加了,同时你的细心,细节问题就会掌握的越好。 实习,我感觉不仅仅是完成任务这么简单,这其中我们能学到其他的东西才是最重要的,当然什么知识的增长,知识的巩固,这都是很基础的。最重要的使我们为以后的工作,生活做一定的铺垫,实习过程中的合作,锻炼自己的细心能力,整理文档,组织材料,当然这些是实习任务之中没有的要求,但是我们会学到这些东西,合作,这个以后工作,生活都离不开的一个必备的能力,我们大家都知道,但是正真的用的时候,我们还是比较的盲,所以这次实习我收获还是很大的,善于沟通,学会合作,学会做人,以后才能更好地生活。 这些就是我这次的实习感受。
八、附录:核心代码清单
基类的构造:
class Graph : public QWidget {
Q_OBJECT public:
explicit Graph(QWidget *parent = 0); virtual ~Graph(){}
bool addtovector(const QVector mydata.clear(); for(int i = 0; i return true; } int getmax() { int max = 0; for(int i = 0; i if(mydata[i]>max) max = mydata[i]; } return max; } 9 i++) protected: virtual void paintEvent(QPaintEvent *) = 0; QVector 饼状类的构造 class MyPie : public Graph { public: MyPie(); protected: void paintEvent(QPaintEvent *); int getsum() { int sum = 0; for(int i = 0; i sum = sum + mydata[i]; } return sum; } private: int OX; int OY; int Radius; }; 折线类的构造: class MyLine : public Graph { public: MyLine(); private: protected: void paintEvent(QPaintEvent *); }; 柱状类的构造: class MyHistogram : public Graph { public: MyHistogram(); protected: void paintEvent(QPaintEvent *); }; 窗口类以及驱动类的构造: class MainWindow : public QMainWindow 10 i++) { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Graph *g; QHBoxLayout *layout; Ui::MainWindow *ui; QString fileload; QVector void openFile(); void showpie(); void showline(); void showhistogram(); void about(); }; 11 因篇幅问题不能全部显示,请点此查看更多更全内容