C++团队/个人课设/大作业去年初稿
工具QT
1.1 项目开发的背景
随着科学技术、社会经济迅猛发展,现代社会要求新时代的人才具有适应岗位、职业变化的能力,其中文档编辑排版能力是日常工作中已是重要的一环。现今各种文档编辑器层出不穷,WPS文档编辑器,集编辑与打印为一体,具有丰富的全屏幕编辑功能,而且还提供了各种控制输出格式及打印功能,使打印出的文稿即美观又规范,基本上能满足各界文字工作者编辑、打印各种文件的需要和要求。
1.2 项目开发的目的
旨在开发一款自定义的轻量级软件,该软件依据用户的使用习惯进行排版设计,其中拥有最基本的常用功能,使用户用可以随意使用该软件编排文档,使打印效果在屏幕上一目了然,使用该软件也可以编辑文字图形、图像、还可以插入其它软件制作的信息,能够满足用户的各种文档处理要求。最后为了避免在进行多文档编辑操作时候文档的频繁切换为带来的效率地下的弊端,我们特意添加的多窗口同时编辑文档的操作,可以大大提高用户多文档编辑操作时的效率。
2.1 C++
支持数据封装和数据隐藏在C++中,类是支持数据封装的工具,对象则是数据封装的实现。C++通过建立用户定义类支持数据封装和数据隐藏。
在面向对象的程序设计中,将数据和对该数据进行合法操作的函数封装在一起作为一个类的定义。对象被说明为具有一个给定类的变量。每个给定类的对象包含这个类所规定的若干私有成员、公有成员及保护成员。完好定义的类一旦建立,就可看成完全封装的实体,可以作为一个整体单元使用。类的实际内部工作隐藏起来,使用完好定义的类的用户不需要知道类是如何工作的,只要知道如何使用它即可。
支持继承和重用在C++现有类的基础上可以声明新类型,这就是继承和重用的思想。通过继承和重用可以更有效地组织程序结构,明确类间关系,并且充分利用已有的类来完成更复杂、深入的开发。新定义的类为子类,成为派生类。它可以从父类那里继承所有非私有的属性和方法,作为自己的成员。
支持多态性采用多态性为每个类指定表现行为。多态性形成由父类和它们的子类组成的一个树型结构。在这个树中的每个子类可以接收一个或多个具有相同名字的消息。当一个消息被这个树中一个类的一个对象接收时,这个对象动态地决定给予子类对象的消息的某种用法。多态性的这一特性允许使用高级抽象。
继承性和多态性的组合,可以轻易地生成一系列虽然类似但独一无二的对象。由于继承性,这些对象共享许多相似的特征。由于多态性,一个对象可有独特的表现方式,而另一个对象有另一种表现方式。
2.2 QT
Qt 是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。2014年4月,跨平台集成开发环境Qt Creator 3.1.0正式发布,实现了对于iOS的完全支持,新增WinRT、Beautifier等插件,废弃了无Python接口的GDB调试支持,集成了基于Clang的C/C++代码模块,并对Android支持做出了调整,至此实现了全面支持iOS、Android、WP,它提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能。基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西。
我的简化版WPS应用程序根据功能可分为:文件、编辑、格式、窗体,帮助四个大的功能模块。具体功能如下:
文件:新建文档、打开文档、文档保存、文档另存为、打印、打印预览和退出;
编辑:撤销、重做、剪切、复制、粘贴;
格式:字体加粗、字体倾斜、字体下划线、段落左对齐、段落居中、段落右对齐、段落两端对齐、字体颜色调整和项目符号;
窗体:关闭、关闭所有、平铺、层叠、下一个,前一个
帮助:关于
本章是根据软件工程知识,对概要设计的具体实现。通过对每个模块的功能进行描述,对功能需求进行分析,编写代码,最终展示出相应的页面。使得整个设计变成一个可运行物理实体,从而达到本次设计的最终目的。
4.1 菜单项工具栏
在ui界面设计模式下,逐项添加菜单工具栏,分别添加文件、编辑、格式、窗体、帮助五个父菜单栏选项,之后分别向五个父菜单栏选项中添加其对应的子功能菜单选项。
在添加好菜单栏选项之后,分别设置每个功能菜单子选项的对象名,状态提示、快捷键和对应的ico图标。设置完成之后,将常用的功能添加到工具列中,不同功能模块之间可以使用分隔符隔开。
最后就可以添加字体组合框(QFontComboBox)、字号组合框(QComboBox)、项目组合框(QComboBox),这样菜单工具栏的界面设计便已完成。
4.2 新建文档
自定义类ChildWnd,该类继承自QTextEdit类。新建文档时使用” WPS 文档 index ”作为新建子窗口的窗口标题,设置窗口标题应该添加 “[]” 占位符,该事件与文档窗口的contentsChanged信号建立连接,一旦文档内容发生改变,就会触发事件,调用文档的isModified去设置modified属性,使得窗口标题中的占位符填充,从而达到文档修改后窗口标题就会出现 ‘’ 号标志位的效果。
在新建文档的函数中,向多文档区域添加子窗口,并且建立槽函数,当用户点击”新建“的按钮后,触发该事件,就会在多文档区域新建一个子窗口。为实现该功能需要将子窗口的copyAvailable(在文本编辑中选择或取消选择文本时,将发出此信号)信号与剪切和复制按钮建立连接,一旦接收到此信号,就将剪切和复制按钮设置为可用(将以深黑色的方式显示)。
4.3 活动子窗口
首先需要在后缀为pro的项目中添加RC_ICONS += images/wps.ico语句,以此来设置WPS应用程序的ico图标。在ui文件中设置WindowTitle为”我的WPS“。
在父级菜单选项的”菜单“选项中,添加关闭窗口、关闭所有窗口、平铺、层叠、下一个、前一个子功能菜单选项。每次有鼠标响应时间之后就根据当前多文档区域是否有活动的子窗口来设置文档操作、窗口操作、格式操作是否可选;若文档打开且有内容被选中,将字体操作和段落操作设置为可用。同时,每新建一个子窗口就需要将子窗口名添加到菜单项中,以供后面实现通过菜单项切换子窗口的功能。
对于每一个子窗口的菜单项,都需要与信号映射器建立关联,这样就可以实现通过菜单项切换窗口的功能了。
QT自动封装了子窗口一系列处理共能,我们只需要建立槽函数和信号连接,并且在槽函数中调用多文档区域类自身封装的相应的功能函数即可。
4.4 打开文档
实现该功能我们需要用到文件打开窗口QFileDialgo类,调用该类的getOpenFileName静态方法实现文件打开窗口,其中我们设置文件可选择的文件打开的类型为html、htm和所有文件,通过该方法我们可以获得想要打开文件的文件路径和文件名,检查多文档区域,如果发现该文档已经打开,就将其窗口设置为活动窗口,如果没有打开,则新建一个子窗口,将想要打开的文件的文件内容读出,并以html/纯文本的格式写入子窗口中,并且设置剪切和复制功能为可用。当我们的文档成功打开之后,我们可以在状态栏给一个”文档已打开“的状态 提示。
4.5 文档保存
文件保存的功能分为文档保存和文档另存为。同样的,为实现这两个功能我们照样利用到了QFileDialog类,调用该方法的getSaveFileName方法弹出一个供用户可选的文件保存窗口。文档的内容一旦修改,则会在窗口标题上显示”*“标志位,表示文档已经修改,当执行保存的时候,如果文档已经修改,则会弹出一个警告窗口,提示文档已修改,是否保存的提示,最后因为我们的自定义类是继承自QTxtEdit类,所以我们会选择以html形式保存,而执行另存为功能时,如果发现所要保存的文档已经存在,则保存失败。
除此之外,还需要重写自定义类ChildWnd的close Event方法,该方法继承自父类,在该类中需要重新实现功能,即对用户在弹出”文档已修改”窗口中所做的选择分别做出接受和忽略的处理。
4.6 文档操作
文档操作集撤销、重做、剪切、复制、粘贴功能于一体,好在是QT中已经封装好了这些功能的函数,我们只需要检测到当前有活动子窗口,就用活动子窗口调用对应功能的方法即可。
4.7 字体格式
字体格式包含加粗、倾斜、下划线三个功能,特别要注意的是,我们一定要将这三个按钮设置为可选的。可以利用QTextCursor类去获取窗口中光标的位置,当选择了字体格式之后,我们需要将选择的字体格式与字符合并即可。最终再利用槽函数进行分别相应即可。
4.8 字体字号
设置字体和字号要用到QTextCharFormat类,分别利用其封装好的setFontFamily和setFontPointSize去设置标准字体格式即可。想要获取用户选择的字体格式和字体大小直接调用activated响应事件便可获得。
4.9 段落对齐
设置段落对齐格式,在QT的方法中,封装了一个函数名为setAlignment方法和一系列对应的宏,在这些宏中,AlignLeft代表着左对齐,AlignRight代表右对齐,AlignCenter代表居中,AlignJustify代表两端对齐。
4.10 字体颜色
设置字体颜色,直接使用QColorDialog颜色对话框便可获取用户选择的颜色,在对选中的字体进行设计。为了用户使用方便,在将字体设置为对应的颜色之后,我们使用QPixmap填充为改颜色,并将菜单栏选项的颜色ico图标设置为已经填充号的图标即可。
4.11 项目符号
对选中的文档进行编辑项目符号操作的话,首先我们要获取列表的格式,设置列表格式的缩进为一个table键的宽度,之后利用setIndent设置块的缩进为0,从项目符号列表的菜单选项中获取用户选择的项目符号,使用setStyle设置标号的风格,如果没有获取到用户所选的格式,则至格式缩进为无效,并且还要将该格式合并到块格式,这样,项目符号的功能便完成了。
4.12 打印预览
为了使项目支持打印和打印预览的模块,我们需要在项目文件中添加QT += printSupport的语句,同时添加一系列队中的头文件。做好基本准备工作之后,便可以着手去实现这些功能了。打印功能的实现需要我们去分配一个打印机资源,再根据QPrintDialog提示窗口获得用户的需求,用这个去初始化打印机资源即可实现打印功能。而实现打印预览功能就需要借用QT的QPrintPreviewDialog窗口,建立槽函数连接,将打印预览窗口所生成的一组预览页面所发出的pianRequested信号与printPreview连接来预览打印页面。
4.13流程图
5 软件测试与分析
软件测试是软件开发中必不可少的阶段。本章中,通过各种测试方法和多个测试用例,对应用进行测试,以期找出系统中可能导致系统出现问题的地方,使得该应用成为一个稳定的,高效的,能够达到用户标准的应用。
5.1测试用例
5.1.1菜单项工具栏
5.2测试环境与测试电脑
Windows 版本:10
测试电脑:联想
5.3测试结果
通过对应用的全面测试,字体颜色,字号,工具栏等测试条目都通过,应用能正常工作。
6总结与展望
通过此次课程设计,使我更加扎实的掌握了有关c++方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。不仅培养了独立思考、动手操作的能力,在各种其它能力上也都 有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。