• 工作总结
  • 个人总结
  • 述职报告
  • 教学资源
  • 心得体会
  • 企业文化
  • 讲话致辞
  • 公文大全
  • 个人文档
  • 实用范文
  • 演讲稿
  • 免费论文
  • 扫黑除恶
  • 世界无烟日
  • 班主任教育
  • 民主生活会
  • 两学一做
  • 对照检查
  • 党性分析
  • 竞赛答案
  • 改革创新奋发有为
  • 党员身份永远
  • 当前位置: 早教700网 > 文档下载 > 免费论文 > 正文

    _桌面时钟设计与实现实习报告

    时间:2020-09-09 08:03:00 来源:早教700网 本文已影响 早教700网手机站

    XX大学信息工程学院 桌面时钟设计与实现实习报告 桌面时钟设计与实现 学 号 姓 名 专业班级 指导教师 实践日期 2014年1月6日-2014年1月17日 目 录 一、综合训练目的与要求 1 二、综合训练任务 1 (1)需求分析 1 (2)任务 1 三、总体设计 2 (1)主要模块划分 2 (2)模块说明 2 四、详细设计说明 3 (1)类图 3 (2)设计说明 3 (3)具体类说明 3 ①calender类 3 ②mainclock类 4 ③main类 4 五、调试与测试 4 (1)第一次调试 4 (2)第二次调试 5 (3)第三次调试 6 (4)第四次调试 7 (5)最后调试 8 六、实习日志 10 七、实习总结 12 八、附录:核心代码清单 13 (1)日历部分代码 13 (2)圆盘时钟部分代码 14 (3)电子时钟部分代码 17 (4)总体布局部分代码 19 (5)主函数部分代码 21 一、综合训练目的与要求 本次面向对象编程实践是学习了C++面向对象程序设计之后进行的必要的实践性环节。由于各种原因,信息管理与信息系统专业是在学习了一年之后才安排了这个实习,因为就在考试周,任务有点繁重。本课综合训练的目的和任务:
    1. 重温和加深对 C++面向对象编程语言的基本知识的理解和掌握;

    2. 掌握 C++语言编程和程序调试的基本技能;

    3. 利用网络资源,自己学习MFC或者Qt等相关软件对页面进行布局;

    4. 学会与他人协作进行小软件的设计,遇到分歧时,能够处理得当,共同完成实践要求。

    二、综合训练任务 (1)需求分析 随着计算机的普及,人们对计算机的要求远不是当初的进行大型数据运算和复杂数据分析了,人与人之间的日常交流,交易等等也都通过计算机来完成了。因为是“日常用品”,当然想让它看起来舒服一些了,因此,人们对电脑桌面美观实用的需求也达到了一定的程度,现在的生活节奏也快了,都希望在最短的时间内完成最多的事,获取最大的信息量。人们为了在用计算机工作的同时,随时了解时间,不错过自己的行程安排。都会在电脑桌面安装一个显示时间日历的小工具,所以桌面时钟的需求还是挺大的。

    (2)任务 ●桌面时钟是日常小工具,所以良好的人机界面应该做到 ●采用面向对象思想设计实现各种类 ●因为涉及界面,所以要运用界面设计,我们选择采用QT做界面设计 ●能够通过自学习运用自带函数来实现功能 ●在实习期间,完成自己负责部分代码的编写和调试,并完成规范的实习论文 三、总体设计 (1)主要模块划分 图 1 主要模块 (2)模块说明 圆盘时钟:指的是圆盘时钟,也就是说,有时针分针秒针显示的时钟,这一模块中,需要绘制各个时针。

    电子时钟:我们把它定义为向电子表那样显示的时钟部分,每秒更新一次,并显示出来。

    日历:日历就是显示当前日历,并能查询前后的日历。

    整体布局:整体布局时,分为水平布局和垂直布局,水平布局用来布局圆盘时钟和电子时钟并行排列,组合之后,和日历的布局用垂直布局完成。圆盘时钟和电子时钟的单布局也是用垂直布局完成的。

    四、详细设计说明 (1)类图 图 2 主要类图 (2)设计说明 圆盘时钟:指的是圆盘时钟,也就是说,有时针分针秒针显示的时钟,这一模块中,需要绘制各个时针,有我的同伴完成,具体实现过程我也限于了解,是先把默认原点坐标移动到中心处,然后分别画刷填充等,定义好指针的形状颜色后,分别画出时针分针秒针,读取当前时间,将各指针每段时间应该旋转的角度计算并设定好,就构成了圆盘时钟了。

    电子时钟:我们把它定义为向电子表那样显示的时钟部分,每秒更新一次,并显示出来。默认状态下,显示的数字位数(包括他们之间的冒号)为5为,这时候,显示的只有小时和分钟。所以要先将它改为8位的格式,让它把小时、分钟、秒钟都显示出来。

    日历:日历就是显示当前日历,并能查询前后的日历。首先要为日历创建一个表格布局,并将其设置成布局尺寸不变,就是说,日历的布局不会随着窗口的拉大而改变大小。用setGridVisible(true)将表格线设置为显示,这样就能在日历版面看到网格线,比较适合大家的审美习惯。把日历表添加到表格布局中,这就算初步完成了日历表格的显示了。

    当然了,总体模块除了以上三个主要部分,还有对整体的布局也是不可或缺的。因此,还有一个重要的模块便是整体布局,整体布局时,分为水平布局和垂直布局,水平布局用来布局圆盘时钟和电子时钟并行排列,组合之后,和日历的布局用垂直布局完成。圆盘时钟和电子时钟的单布局也是用垂直布局完成的。

    (3)具体类说明 /*因为前面已经提到过同伴负责的部分,在这一块就不做说明*/ ①calender类 Calender类用来实现日历的显示,继承了QT里的基类QWidget,定义了一个public成员变量calender(),用来声明日历的构造函数。Private成员变量createPreviewGroupBox()声明日历框中的函数。设计的两个函数:
    1.calender(),设计日历类,实现创建日历表格、创建表格布局对象,还有一些基本设置。

    2.createPreviewGroupBox(),设计日历表格框里的布局,将日历导入表格布局中,再将表格布局添加到窗口部件“日历查询”分组框中。

    ②mainclock类 Mainclock类用来实现总体布局,将圆盘时钟、电子时钟、日历有机结合起来,使得人机界面友好美观。在继承基类情况下,定义了一个public成员变量mainclock.在源文件中进行详细设计说明。首先是窗口类,设计窗口的标题,用库函数中的Qdate获取当前时间,以便程序进行。然后,创建圆盘时钟对象,对圆盘时钟在总布局中的位置怎么显示进行具体设置,并设置分组框标题。其次,设置当前日期(年月日),创建电子时钟对象,电子时钟和当前日期设为垂直布局,他们组合后,与圆盘时钟的布局为水平布局。最后,创建日历对象,将日历添加到布局当中。详细设计见代码。这就算完成了总体布局了。

    ③main类 主类,用来将所有的类组合起来,为总程序服务,控制整个桌面时钟的运行。

    五、调试与测试 (1)第一次调试 如下图(即图3)所示,为第一次调试结果,只是简单地将日历部分加入布局。

    图 3 第一次调试结果 (2)第二次调试 如图4所示,是第二次调试的结果,将圆盘时钟和电子时钟的框架先布置好。

    图 4 第二次调试结果 (3)第三次调试 如图5所示,为第三次调试结果,在把圆盘时钟和电子时钟加入布局后,显示日历部分。

    图 5 第三次调试结果 (4)第四次调试 图6所示为第四次调试结果,在第三次调试结果基础上,将同伴做好的圆盘时钟加入布局管理器。

    图 6 第四次调试结果 (5)最后调试 以下图7、图8为最后调试的结果,两个是一样的,就是选的时间段不一样,电子时钟上的两个冒号一个显示着,一个没显示,因为它和秒钟是一样一秒更新一次,一秒显示一次的。

    图 7 最后调试-1 图 8 最后调试-2 六、实习日志 工作日志即每日的安排、进度、完成情况,还有一些感想什么的。

    表格 1 工作日志 日期 实习内容 2014-1-6 今天写了一下实施计划书,把未来两周的安排看了一下,还有明确了一下实习目的,安装了Qt,看了一堆教程,各种教程,关于MFC的、关于Qt的,总之就是查资料,发现,其实机房应该安装一下我们需要的软件,不然我们还得每天过来安装,太麻烦、太费事了。这一天过得感觉毫无头绪,也找不着自己要干什么,怎么开始。

    2014-1-7 今天还是在学习Qt的使用,因为分析了一下,我们决定用Qt写,之前安装的Qt不知道版本问题还是什么问题,用不了,后来从同学那拷了一个,安装在自己的电脑上,因为以为机房有保护卡,后来发现,在机房的操作系统下,那个也不能用。今天为止,完成了项目总体设计与模块划分,由我负责桌面时钟上显示的日历部分和整体的布局。经过分析讨论,要实现我们想要的功能,要设计日历、时钟的三个针、数字时钟等等几个类。

    2014-1-8 早上跟着老师简单的了解了一下MFC。胡老师说找了个熟悉Qt的老师抽时间给我们讲讲,我们等的就是这一天呐,自己摸索总是费些时间的。但是,我们肯定也不会干等着什么也不干,对自己负责的部分,要动手进行整体构思,具体怎么实现。开始简单的编写。下午将近4点的时候,耿楠老师来给我们介绍了一下QT,还给了一些参考资料。

    2014-1-9 昨天下午看了耿楠老师给的资料之后,现在开始模仿QT里面给的示例敲程序,刚好里面也有关于时钟日历的样例。我就参考示例里的日历结合我们想要的效果进行修改。在示例中,我们只需要日历部分。在写好部分代码构建好执行时,出现了“:-1: error: Qt Creator 需要设置一个编译器来构建。在构建套件选项里设置一个编译器”这个错误,没找着解决方法。

    2014-1-10 昨天的编译器问题没有解决,就直接新建一个工程,把写好的代码拷贝过来,通过在网上查找资料,了解一些库函数,对象的使用方法和功能,然后编写自己的代码。今天初步完成了日历部分的代码。开始着手进行布局。

    2014-1-13 这几天真痛苦,白天实习,晚上去上自习基本上到11点,复习马上到来的三门考试,过着“充实”的生活。其实心里很毛,想着实习能好好做完,又想着考试也能通过。今天写布局部分。考虑到美观,让人看起来舒心一些,在布局时,经过商量,决定将日历放在最下面,上面左边放圆盘时钟(这个名字我喜欢这样叫,比较形象),右边放电子时钟 2014-1-14 今天稍微看了一下布局的相关资料,以便赶紧完成实习,毕竟一个周已经过去了。考试搞得人有点慌慌的,好像老师也知道我们今天有考试,大家在复习,老师也比较开明,没有说什么,所以,今天其实没有做什么实质性的东西。

    2014-1-15 早上考Web去了,没有实习,晚上也有考试,额,很不好意思地说,今天下午就用来背书了,因为两天都什么不干,还是很不好意思的。老师自己应该也为我们捏一把汗,一边要实习,一边还要复习考试,两边都不能耽误,兼顾起来又很困难,所以,我们只好先把考试顾好。下来再抽时间赶实习。

    2014-1-16 试考完了,放下了一个大包袱,就能轻轻松松做实习的事了。今天把程序部分基本完成了,在写实习论文,还有用亿图软件画一些基本图形,准备明天早上的答辩。其实,论文也不是那么好写的,你做了什么,只能流水账似的把它写一遍,想说的话也表达不出来。

    2014-1-17 昨晚把答辩用的PPT赶出来了,今天是答辩的日子。

    七、实习总结 这次面向对象编程实习收获了很多,首先是认识到自身知识的欠缺,由于之前学习C语言、C++面向对象编程语言时,没有好好学习,基础知识不扎实,做起来困难重重。不过,因为这次实习是两人合作,在实习过程中,通过看示例,还有合作同伴的帮忙,也大概把东西做出来了。其次是,更加系统地复习了面向对象的编程思想。

    “面向对象”是专指在程序设计中采用封装、继承、抽象等设计方法。

    在程序员眼里,世界就是由类和对象构成的。类描述了一组有相同特性(属性)和相同行为(方法)的对象。在程序中,类实际上就是数据类型。面向过程的语言与面相对象的语言的区别就在于,面向过程的语言不允许程序员自己定义数据类型,而只能使用程序中内置的数据类型。而为了模拟真实世界,为了更好的解决问题,往往我们需要创建解决问题所必需的数据类型。面向对象编程为我们提供了解决方案。运用类的封装、继承等,实现程序功能。

    我们这次的课题是桌面时钟的设计与实现,内部要实现三个功能,分别是圆盘时钟、电子时钟、日历。这三个模块之间是肯定要进行一定的“排版”,也就是布局的。通过良好的整体布局,桌面时钟这个日常小工具才会比较受人欢迎,谁也不喜欢看着不好看不顺眼的东西。

    在编写代码过程中,要思考类怎么实现,参数怎么传,怎么封装一个类,脑子里面有个全局布局,写的时候才能比较有效率。

    整个实习过程中,从合作同伴的帮助特别大,我自己查资料看了也不明白的,问她,她一般都能给我解决,学到了不少东西,还有就是查找网上的资源,这次用得特别多。

    总而言之,这次的实习时间安排的不是那么的尽人意,但是,最后完成了,这两周以来,过得很充实,每天基本没有空闲时间,说白了就是连洗衣服的时间都没有,但是同时学到了很多,团队合作啊,编程也熟悉了一些。

    八、附录:核心代码清单 /*代码颜色就不改了吧,看着比较清晰有层次。*/ (1)日历部分代码 calendar.h:
    #ifndef CALENDAR_H #define CALENDAR_H #include <QWidget> //对类的指针进行声明,没有实例化 QT_BEGIN_NAMESPACE class QCalendarWidget; class QGridLayout; class QGroupBox; QT_END_NAMESPACE class Calendar : public QWidget { Q_OBJECT //宏,只有加入了该宏,才能使用QT中的single和slot机制 public: Calendar(); //声明日历的构造函数 private: void createPreviewGroupBox(); //声明创建预览日历框中的函数 QGroupBox *previewGroupBox; //QGroupBox窗口部件提供了一个有标题的组合框 QGridLayout *previewLayout; //QGridLayout表格布局 QCalendarWidget *calendar; //QCalendarWidget提供了基于月份的日历,使得用户可以选择当前日期 }; #endif // CALENDAR_H calendar.cpp: #include “calendar.h“ #include <QtGui> #include <QtWidgets> /*日历的构造函数*/ Calendar::Calendar() { createPreviewGroupBox(); //创建一个日历表格 QGridLayout *layout = new QGridLayout; //新建一个表格布局的对象 layout->addWidget(previewGroupBox); //把日历表格添加到表格布局中 layout->setSizeConstraint(QLayout::SetFixedSize); //固定表格布局尺寸不变 setLayout(layout); //设置布局 } /*创建日历表格*/ void Calendar::createPreviewGroupBox() { calendar = new QCalendarWidget; //获得一个日历对象 calendar->setGridVisible(true); //显示日历表格中的表格线 //新建一个QGroupBox窗口部件,标题为“日历查阅” previewGroupBox = new QGroupBox(tr(“日历查阅“)); previewLayout = new QGridLayout; //新建一个表格布局 //previewLayout->addWidget(calendar, 0, 0, Qt::AlignRight); previewLayout->addWidget(calendar, 0, 0, Qt::AlignCenter); //把日历对象放入到坐标(0,0)处,并居中对齐 //用setLayout方法把带有日历的表格布局添加到窗口部件“日历查询”分组框中 previewGroupBox->setLayout(previewLayout); } (2)圆盘时钟部分代码 clock.h #ifndef CLOCK_H #define CLOCK_H #include <QWidget> class Clock : public QWidget { Q_OBJECT public: int hour; int minute; int second; Clock(QWidget *parent=0); virtual ~Clock(); private: void paintEvent(QPaintEvent *event); }; #endif // CLOCK_H clock.cpp #include <QtGui> #include <QtGlobal> #include “Clock.h“ #include <QImage> #include <QPainter> Clock::Clock(QWidget *parent): QWidget(parent) { QTimer *time=new QTimer();//定义定时器 connect(time,SIGNAL(timeout()),this,SLOT(update()));//信号和槽 time->start(1000);//刷新周期为1s } Clock::~Clock() { } void Clock::paintEvent(QPaintEvent *event) { int size =qMin(width(),height());//获取窗口最小长度 QTime t=QTime::currentTime();//获取当前系统时间 QPainter paint(this); //定义指针颜色 QColor hourColor(127,0,127); QColor minuteColor(0, 127, 127, 191); QColor secondColor(0,0,0); Clock myclock; myclock.hour=t.hour(); myclock.minute=t.minute(); myclock.second=t.second(); paint.setRenderHint(QPainter::Antialiasing);//去掉锯齿,使边缘平滑 paint.translate(width()/2,height()/2);//设置原点坐标位置 paint.scale(size/200,size/200);//设置缩放比例 //定义时针形状 static const QPoint hourHand[4] = { QPoint(5, 0), QPoint(0,9), QPoint(-5, 0), QPoint(0, -50), }; //刻画时针 paint.setPen(Qt::NoPen);//设置画笔颜色 paint.setBrush(hourColor);//设置画刷颜色(即填充色) paint.save(); paint.rotate(30.0 * ((myclock.hour+ myclock.minute / 60.0)));//设置每次刷新时时针转动角度 paint.drawConvexPolygon(hourHand,4);//刻画时针 paint.restore(); //定义分针形状 static const QPoint minuteHand[4] = { QPoint(5, 0), QPoint(0,9), QPoint(-5, 0), QPoint(0, -70), }; //刻画分针 paint.setPen(Qt::NoPen); paint.setBrush(minuteColor); paint.save(); paint.rotate(6.0 * (myclock.minute+ myclock.second / 60.0)); paint.drawConvexPolygon(minuteHand,4); paint.restore(); //定义秒针形状 static const QPoint secondHand[4]= { QPoint(4,0), QPoint(0, 9), QPoint(-4,0), QPoint(0,-90), }; //刻画秒针 paint.setPen(Qt::NoPen); paint.setBrush(secondColor); paint.save(); paint.rotate(6.0*(myclock.second)); paint.drawConvexPolygon(secondHand,4); paint.restore(); //定义时点刻度形状 static const QPoint hourNode[4]= { QPoint(0,98), QPoint(0,92), QPoint(-3,95), QPoint(3,95), }; //刻画表盘 paint.setPen(hourColor); paint.setBrush(hourColor); for (int i = 0; i < 12; ++i) { //paint.drawLine(88, 0, 96, 0); paint.drawConvexPolygon(hourNode,4); paint.rotate(30.0); } paint.setPen(minuteColor); for (int j = 0; j < 60; ++j) { if ((j % 5) != 0) paint.drawLine(92, 0, 96, 0); paint.rotate(6.0); } } (3)电子时钟部分代码 digitaiclock.h /*定义电子表头文件*/ #ifndef DIGITALCLOCK_H #define DIGITALCLOCK_H #include <QtGui> #include <QDialog> #include <QLCDNumber> #include <QTimer> class DigitalClock : public QLCDNumber { Q_OBJECT public: DigitalClock(QWidget *parent = 0); private slots: void showTime(); private: bool showColon;//标志变量 }; #endif // DIGITALCLOCK_H digitaiclock.cpp #include “digitalclock.h“ #include <QTime> #include <QLCDNumber> DigitalClock::DigitalClock(QWidget *parent):QLCDNumber(parent) { this->setDigitCount(8);//设置输出显示为8位,默认为5位 //this->setNumDigits(8); QTimer *timer=new QTimer(); connect(timer,SIGNAL(timeout()),this,SLOT(showTime())); timer->start(1000); showColon=true; } void DigitalClock::showTime() { QTime time=QTime::currentTime(); QString strTime; if(showColon) { strTime=time.toString(“hh:mm:ss“); showColon=false; } else { strTime=time.toString(“hh mm ss“); showColon=true; } display(strTime); } (4)总体布局部分代码 mainclock.h #ifndef MAINCLOCK_H #define MAINCLOCK_H #include <QWidget> class MainClock: public QWidget { Q_OBJECT public: MainClock(QWidget *parent = 0); }; #endif // MAINCLOCK_H mainclock.cpp #include “mainclock.h“ #include “clock.h“ #include “digitalclock.h“ #include “calendar.h“ #include <QGroupBox> #include <QLabel> #include <QBoxLayout> #include <QTextCodec> #include <QDate> #include <QtWidgets> MainClock::MainClock(QWidget *parent): QWidget(parent) { this->setWindowTitle(“桌面时钟“); //this->setWindowTitle(QString::fromLocal8Bit(“桌面时钟“)); //有些QT版本需转换编码 QDate date = QDate::currentDate(); //获取当前时间 QString text1 = date.toString(tr(“ yyyy年MM月dd日“)); //获得指定格式日期 QString text2 = date.toString(tr(“ dddd“)); //获得指定格式星期几 /*显示时钟表*/ Clock *clock=new Clock; //定义时钟表对象 QGroupBox *groupbox1=new QGroupBox(tr(“时钟表“)); //新建“时钟表”分组框 QVBoxLayout *layout1=new QVBoxLayout ; //新建垂直布局管理器 layout1->addWidget(clock); //把时钟表对象加入垂直布局管理器中 groupbox1->setLayout(layout1); //把垂直布局管理器加入“时钟表”分组框中 QFont font1 = groupbox1->font();//获得“时钟表”分组框标题的字体对象 font1.setPointSize(12); //设置字体大小为12 font1.setBold(true); //设置字体加粗 groupbox1->setFont(font1); //把分组框标题改为设置后font对象 /*显示当前日期*/ QLabel *label1=new QLabel(text1) ; //新建标签类(当前日期“年月日”) QLabel *label2=new QLabel(text2) ; //新建标签类(“星期几”) QGroupBox *groupbox2=new QGroupBox(tr(“今天是“)); //新建当前日期“今天是“分组框 QVBoxLayout *layout2=new QVBoxLayout ; //新建垂直布局管理器 layout2->addWidget(label1); //把标签类加入垂直布局管理器 layout2->addWidget(label2); groupbox2->setLayout(layout2); //把垂直布局管理器layout2加入“今天是”分组框中 QFont font4 = groupbox2->font(); //设置“今天是”分组框标题样式 font4.setPointSize(12); font4.setBold(true); groupbox2->setFont(font4); QFont font2 = label1->font(); /*设置当前日期显示样式*/ font2.setPointSize(24); font2.setBold(true); label1->setFont(font2); QPalette palette1; //定义调色板 palette1.setColor(QPalette::WindowText,Qt::red); //指定颜色为红色 label1->setPalette(palette1); //把指定调色板颜色应用于标签1(“年月日”) QFont font3 = label2->font(); /*设置星期显示样式*/ font3.setPointSize(24); font3.setBold(true); label2->setFont(font3); QPalette palette2; palette2.setColor(QPalette::WindowText,Qt::red); label2->setPalette(palette2); /*显示电子时钟*/ DigitalClock *digitalClock=new DigitalClock ; //定义电子表对象 QVBoxLayout *layout3=new QVBoxLayout ; //新建垂直布局管理器layout3 layout3->addWidget(groupbox2); //把“今天是”分组框加入垂直布局管理器layout3中 layout3->addWidget(digitalClock); //把电子时钟加入垂直布局管理器layout3中 /*把时钟表、当前日期以及电子时钟都加入一个水平布局管理器layout4*/ QHBoxLayout *layout4=new QHBoxLayout ; layout4->addWidget(groupbox1); layout4->addLayout(layout3); /*显示日历*/ Calendar *calendar=new Calendar; QVBoxLayout *layout5=new QVBoxLayout ; //新建垂直布局管理器,存放所有容器 layout5->addLayout(layout4); layout5->addWidget(calendar); setLayout(layout5); //设置布局 //layout5->setSizeConstraint(QLayout::SetMinAndMaxSize); QFont font5 = calendar->font(); //设置日历边框字体样式 font5.setPointSize(12); font5.setBold(true); calendar->setFont(font5); resize(500,490) ; } (5)主函数部分代码 main.cpp #include <QtGui> #include <QApplication> #include “mainclock.h“ int main(int argc, char *argv[]) { QApplication a(argc, argv); MainClock clock; clock.show(); return a.exec(); }

    • 早教知识
    • 学习资源
    • 优美散文
    • 阅读
    • 才艺
    • 教育
    • 智力开发