




已阅读5页,还剩52页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
毕 业 设 计 学院: 软件学院 系别: 软件工程 专业班级: 所属基地:昆山杰普软件科技有限公司太原理工大学毕业设计(论文)任务书毕业设计(论文)题目:基于Qt的多文档编辑器的实现毕业设计(论文)要求及原始数据(资料):1了解当下多文档编辑器的基本需求和使用情况;2深入了解多文档编辑器相关技术;3熟练掌握QT的使用方法,训练编写程序的能力;4设计并实现多文档编辑器并增加一些创新;5深刻体会软件开发流程及测试;6训练检索文献资料和利用文献资料的能力;7训练撰写技术文档与学位论文的能力。毕业设计(论文)主要内容:1综述当今对于多文档编辑器的需求和现状;2了解实现多文档编辑器所用到的相关技术;3熟悉QT的开发环境以及C+语言知识的掌握; 4理解数据库结构的设计,搭建平台保存文档;5.深入分析编写过程中类库的使用方法和关键技术;6设计实现多文档编辑器的功能模块,完成多文档编辑器的基本功能;7完成系统功能的调试和测试学生应交出的设计文件(论文):1内容完整、层次清晰、叙述流畅、排版规范的毕业设计论文;2包括毕业设计论文、源程序等内容在内的毕业设计电子文档及其它相关材料。主要参考文献(资料):1 霍亚非. Qt Creator 快速入门M. 北京:北京航空航天大学出版社, 2008.2 霍亚非. Qt及QTQuick实战开发精解M. 北京:北京航空航天大学出版社, 2008.3 布兰切特, 萨摩菲尔德. C+ GUI Qt4编程M.第二版.闫峰欣,等,译M. 北京:电子工业出版社, 2008.4 蔡志明, 卢传富, 李立夏, 等. 精通Qt4编程MM. 北京:电子工业出版社, 2008.5 成结, 卢紫毅. Linux窗口程序设计-Qt4 精彩实例分析MM. 北京:清华大学出版社, 2008.6 王珊, 萨师煊. 数据库系统概论MM. 北京:高等教育出版社, 2006.7 谢希仁. 计算机网络M.第5版M. 北京:电子工业出版社, 2008.8 Stanley, B, Lippman, Barbara, E, Moo, Josee, LaJoie. C+ Primer中文版M.第4版M. 李师贤,等,译.北京:人民邮电出版社, 2006.9 Horowitz E, Sahni S. Fundamentals of Data Structures. Pitmen Publishing Limited, 197610 Gotlieb C C, Gotlieb L R. Data Structures Using PASCAL. Prentice Hall , Inc.,198111 Baron R J , Shapior L G . Data Structures and their Implementation . Van Nostrand Reinhold Company , 1980专业班级软件1120班学生张 健要求设计(论文)工作起止日期2015年3月23日2015年7月3日指导教师签字日期2015年3月23日教研室主任审查签字日期系主任批准签字日期基于Qt的多文档编辑器的实现摘要如今,计算机以及网络技术的发展,社会不断的向着信息化社会前进,我们需要更智能,更专业的软件来帮助我们完成工作,从而提高工作效率。此次设计为简易的多文档编辑器。本次设计是在windows下使用QT作为面向对象的开发工具,以Qt基本知识为基础,探讨学习利用C+语言知识及Qt的流程和框架编写多文档编辑器,实现基本的创建、保存等文本操作,剪切、复制、黏贴等编辑操作,对于主窗体下实现多个文档窗口同时操作,使之更符合操作者使用习惯,对方便快捷的操作数量较多的相关文档具有实际意义。关键字:面向对象;C+;Qt;多文档编辑器Realization OfMulti Document Editor Based OnQtAbstract.Nowadays, the development of computer and network technology, society towards the information society, we need to be more intelligent, more professional software to help us to finish the work, so as to improve the work efficiency.This design is a simple multi document editor. This design is the use of QT as a development tool that faces to the object in the windows, Qt basic knowledge as the foundation, study the process and framework of the C+ language knowledge and the preparation of Qt multi document editor, the realization of the basic establishment, save text operation, cut, copy, paste and other editing operations, for the realization of multi the document window the main window operation at the same time, to make it more in line with user habits, which has practical significance for the operation of a large number of relevant documents and convenient.Keywords: faces to the object ;C+; Qt; multi document editor;目 录1 绪 论11.1 问题的提出和可行性分析11.1.1 问题的提出11.1.2 可行性研究11.2 开发工具介绍21.2.1 Qt及Qt Creator简述21.2.2 Qt功能与特性21.2.3 Qt Creator功能和特性31.2.4 Qt的历史31.2.5 Qt的特色41.2.6 Qt Quick介绍61.3 Qt关键技术72 设计实现92.1 界面设计92.2 创建子窗口类92.2.1 新建文件操作newFile()102.2.2 加载文件操作loadFile()112.2.3 保存操作sava()132.2.4 另存为操作saveAs()132.2.5 关闭操作closeEvent()142.3 实现菜单功能162.3.1 更新菜单状态162.3.2 新建文件操作172.3.3 实现打开文件操作192.3.4 添加子窗口列表202.3.5 实现其他菜单功能222.4 完善程序功能232.4.1 保存窗口设置232.4.2 自定义右键菜单242.4.3 其他功能252.5 成果展示272.6 待深入研究293 结 论314 致 谢335 参考文献346 外文文献356.1 外文原文356.2 中文翻译431 绪 论1.1 问题的提出和可行性分析1.1.1 问题的提出随着计算机技术的不断发展,文本编辑器成为大家必不可少的工具,但是不同的用户对文本编辑器有不同的功能需求,所以除了像office中的word还有WPS等大众文本编辑器,还需要一些带有一定相关专业功能的文本编辑器,可以方便用户进行工作与开发。本设计就是针对底层用户开发的,及文本操作、编辑操作、格式操作于一体的简易文本编辑器。根据此文本编辑器的的实际要求,本系统需要实现以下功能:要求在运行该编辑器时,可以直接编辑默认的新建文件,在上方标签中显示正在编辑的文件。要求在菜单栏下面设有工具栏,分别有打开按钮,新建按钮,保存按钮,帮助按钮,复制按钮,剪切按钮,粘贴按钮等。要求能新建,打开和保存文件。要求能够完成剪切、复制、粘贴、恢复、撤销等编辑操作。1.1.2 可行性研究市场上出现的和用户所使用的文本编辑器种类繁多,功能也是各式各样,其中有相当一部分是很优秀的。但是面向底层用户的的操作简单的,界面友好的,集文本操作、编辑操作、格式操作于一体的编辑器并不多见。根据此文本编辑器的使用对象,新目标的提法不尽相同,例如:提高工作效率和降低难度;精简操作界面,是其更直观、更易于使用;新编辑器的目标确定后,就可以从以下三方面对能否实现新目标进行可行性分析:1) 技术可行性研究 面向对象是一种新兴的程序设计方法,或者说是一种新的程序设计规范,其基本思想是使用对象、类、继承、封装、消息等基本概念来进行程序设计。从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。开发一个软件是为了解决某些问题,这些问题所涉及的业务范围称作该软件的问题域。其应用领域不仅仅是软件,还有计算机体系结构和人工智能等。许多程序开发工具,如 Visual Basic 6.0、Delphi等等,都支持面向对象的程序开发。这些技术目前已经成熟,被广泛应用与各个领域。运用GUI中的类和对象以及相关的类完全可以实现所要求的功能。因此,其设计开发在技术上是可行的。2) 经济可行性研究经济可行性研究是对设计投入使用后带来的经济效益进行估计。本设计所消耗的物力与财力不多,关键是思想架构,设计成功后可在互联网上供用户下载。经济效益与经济投资是很少的,也达到收支平衡。3) 运行可行性研究系统设计并运行于当前流行的windows系列操作系统,此文本编辑器操作简单,界面友好,用户可以立即使用。总之,系统具有较好的运行可行性。综上所述,开发一个专门的文本编辑器是可行的。1.2 开发工具介绍1.2.1 Qt及Qt Creator简述Qt 是一个跨平台应用程序和 UI开发框架。使用 Qt您只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序。Qt Creator 是全新的跨平台 Qt IDE(集成开发环境),可单独使用,也可与 Qt库和开发工具组成一套完整的SDK(Software Development Kit即软件开发工具包 ).其中包括:高级 C+代码编辑器,项目和生成管理工具,集成的上下文相关的帮助系统,图形化调试器,代码管理和浏览工具。1.2.2 Qt功能与特性直观的C+类库:模块化Qt C+类库提供一套丰富的应用程序生成块 (block),包含了构建高级跨平台应用程序所需的全部功能。具有直观,易学、易用,生成好理解、易维护的代码等特点。跨桌面和嵌入式操作系统的移植性:使用Qt,您只需一次性开发应用程序,就可跨不同桌面和嵌入式操作系统进行部署,而无须重新编写源代码,可以说Qt无处不在(Qt Everywhere)使用单一的源代码库定位多个操作系统,通过重新利用代码可将代码跨设备进行部署,无须考虑平台,可重新分配开发资源。代码不受担忧平台更改影响的长远考虑,使开发人员专注于构建软件的核心价值,而不是维护 API。具有跨平台 IDE的集成开发工具:Qt Creator是专为满足 Qt 开发人员需求而量身定制的跨平台集成开发环境 (IDE)。Qt Creator可在 Windows、Linux/X11和 Mac OS X桌面操作系统上运行,供开发人员针对多个桌面和移动设备平台创建应用程序。在嵌入式系统上的高运行时间性能,占用资源少。1.2.3 Qt Creator功能和特性复杂代码编辑器:Qt Creator的高级代码编辑器支持编辑C+和QML (JavaScript)、上下文相关帮助、代码完成功能、本机代码转化及其他功能。 版本控制:Qt Creator汇集了最流行的版本控制系统,包括Git、Subversion、Perforce、CVS和Mercurial。集成用户界面设计器:Qt Creator提供了两个集成的可视化编辑器:用于通过Qt widget生成用户界面的Qt Designer,以及用于通过QML语言开发动态用户界面的Qt Quick Designer*。 项目和编译管理:无论是导入现有项目还是创建一个全新项目,Qt Creator都能生成所有必要的文件。包括对cross-qmake和Cmake的支持。桌面和移动平台:Qt Creator支持在桌面系统和移动设备中编译和运行Qt应用程序。通过编译设置您可以在目标平台之间快速切换。Qt模拟器:Qt模拟器是诺基亚Qt SDK的一部分,可在与目标移动设备相似的环境中对移动设备的Qt应用程序进行测试。 1.2.4 Qt的历史1992年,一批Qt程序员开始编写QT程序; 1994年Trolltech(奇趣)公司成立,提供所有的有关Qt的服务;1996年,Qt进入商业领域,成为全世界应用程序基础开发的重要角色;2008年初,Trolltech被Nokia收购;Trolltech主要为诸如eBay公司的Skype、GoogleEarth和Adobe Systems的Photoshop Elements提供软件和应用程序平台;1.2.5 Qt的特色(1)先进的图形用户界面(GUI) Qt为您在桌面与嵌入式平台上开发先进的GUI应用程序,带来所有需要的功能。Qt使用所支持平台的本地化图形API,充分利用系统资源并给予应用程序本地化的界面。从按钮和对话框到树形视图与表格都具有完整的控件(窗体),自动缩放,字体、语言与屏幕定位识别布局引擎,支持抗锯齿、矢量变形以及可缩放矢量图形 (SVG),具有样式API和窗体样式可完全自定义用户界面,支持嵌入式设备的硬件加速图形和多重显示功能。(2)基于OpenGL 与OpenGL Es的3D图形 OpenGL 是一个标准的图形库,用于构建跨平台和支持硬件加速的高性能可视化应用程序。虽然OpenGL完美支持3D图形,但却不支持创建应用程序用户界面。Qt通过与OpenGL的紧密集成解决了这一难题。在您的应用程序中轻松加入3D图形在嵌入式Linux与Windows CE平台上使用OpenGL ES和OpenGL绘画引擎利用系统资源实现最佳图形性能支持Windows平台上的Direct3D。(3)多线程多线程编程是一个执行资源密集型操作而不会冻结应用程序用户界面的有效典范。Qt的跨平台多线程功能简化了并行编程,另外它附加的同步功能可以更加轻松地利用多核架构。管理线程、数据和对象更加轻松,基于Qt的信号与槽,实现跨线程类型安全的对象间通讯,高端API可以编译多线程程序而无须使用底端基元。 (4)嵌入式设备的紧凑视窗系统Qt构建在标准的API基础上,用于具有轻量级window系统的嵌入式 Linux设备。基于Qt的应用程序直接写入 Linux帧缓冲,解除了您对 X11视窗系统的需求。减少内存消耗,内存占用更小,可以编译移除不常使用的组件与功能,可以利用硬件加速图形在桌面系统上的虚拟帧缓冲可用于嵌入式开发与调试。(5)对象间通讯在开发用户图形界面中,一个常见的、重复发生系统崩溃与问题的症结根源是如何在不同组件之间进行通信。对于该问题,Qt的解决方案是信号与槽机制,即执行Observer设计模式。我们可以简单理解为当特殊事件发生的时候,信号就被发出了,一个插槽就是一个函数,被称作特定信号的响应。信号与槽机制是类型安全的(type safe),任意信号都可以连接任意或多个插槽,或跨多个线程,简化真正的组件编程。 (6)2D图形Qt给您提供一个功能强大的2D图形画布,用以管理和集成大量的图形元素。高精度可视化大量元素、将窗体互动嵌入至图形场景中、支持缩放、旋转、动画与透视变换。(7)多媒体框架Qt使用Phonon多媒体框架为众多的多媒体格式提供跨桌面与嵌入式操作系统的回放功能。Phonon可以轻松将音频与视频回放功能加入到Qt应用程序当中,并且在每个目标平台上提取多媒体格式与框架。以平台独立的方式提供多媒体内容,从本地文件读取媒体或读取网络上的流媒体,提取Mac上的QuickTime,Windows上的DirectShow以及Linux上的Gstreamer。(8)WebKit集成Qt WebKit集成,即Qt集成了WebKit功能,WebKit是KDE项目下基于 KHTML的开放源web浏览器引擎。目前Apple,Google与Nokia等公司使用Qt WebKit集成。将web与本地内容和服务整合在单一的富应用程序当中,快速创建整合实时web内容与服务的应用程序,使用集成在本地代码中的HTML与Java Script,完全控制跨平台的浏览器环境。(9)网络连接Qt让您网络编程更简单,并支持跨平台网络编程。完整的客户/服务器插口提取、支持HTTP,FTP,DNS与异步 HTTP 1.1、无论HTML和XML或图象与媒体文件,它都可以存取所有类型的数据。(10)XMLQt为XML文件以及SAX和DOM协议的C+实现,提供了一个流媒体文件读写器。同时Qt还包含了XQuery 一个简单的类似SQL的查询语言,用于解析XML文件来选择和聚合所需要的XML元素,并且将它们转换成XML输出或其它格式的输出。仅需少数几行代码便可实现先进的 XML查询,完全支持XQuery 1.0和XPath 2.0在您自己的应用程序中从XML查询、抽取和转换数据。(11)脚本引擎Qt包含一个完全集成ECMA标准的脚本引擎。QtScript提供QObject集成,把Qt的信号与槽机制整合成脚本,并且实现了C+与脚本的集成。基于ECMA标准的脚本语言 (ECMAScript 3是JavaScript 1.5的基础),为简化的对象间通讯使用Qt的信号与槽机制,开创新的契机将脚本与您的Qt应用程序相集成。数据库Qt帮助您将数据库与您的Qt应用程序无缝集成。Qt支持所有主要的数据驱动,并可让您将SQL发送到数据库服务器,或者让Qt SQL类自动生成SQL查询。支持所有主要的数据库驱动,以多种视图或数据识别表单方式显示数据。 1.2.6 Qt Quick介绍Qt Quick是在Qt 4.7中被引进的一项技术。Qt Quick是一种高级用户界面技术,开发人员和设计人员可用它协同创建动画触摸式用户界面和应用程序。它由三部分构成:(1)QML:像 JavaScript一样的声明式语言;(2)Qt Creator:在Qt IDE中的直观工具;(3)Qt Declarative:强大的C+模块。主要组成QML:基于 JavaScript的直观语言:QML是一种简便易用的语言,开发人员与用户界面设计人员无需任何 C+知识,即可用其描绘出用户界面的外观和功能。面向开发人员和设计人员的共享工具:Qt Creator IDE 2.1版将集成一套开发人员与用户界面设计人员可共享,用以创建和实施Qt Quick项目的通用工具。通过C+推动QML应用程序:在Qt库中的全新 Declarative 模块支持生成动态可定制的用户界面,以及通过C+拓展QML应用程序。功能特点快速开发动画式流畅多变的用户界面:通过直观的QML语言和一套丰富的QML ElementsUI 和行为生成块您可以快速创建出令人印象深刻的用户界面,比你想象的还要快。无需 C+知识:如果您具有JavaScript的经验或掌握基本的网络技术(如HTML和 CSS),您就可以通过QML取得非常不错的成果。瞄准数以百万计的触摸屏设备:使用 Qt Quick,您可以为数以百万计的 Symbian和MeeGo设备生成应用程序,或为各种类型的触摸屏消费类电子设备创建用户界面。 .应用领域 汽车信息娱乐系统UI:Cybercom Group的用户界面设计人员与开发人员尝试使用 Qt Quick为其汽车信息娱乐平台设计UI并取得了令人满意的结果。社交媒体电视:mixd.tv使用Qt Quick为其跨平台网络电视应用程序创建UI,其用户可以通过社交媒体频道访问和共享在线视频的内容。联网汽车:Qt的认证合作伙伴Digia很快学会了 Qt Quick并用其创建出了包括导航、电话、游戏和音乐功能的高级汽车UI。1.3 Qt关键技术Qt中比较关键的技术是信号与槽,以及事件。用信号和槽机制可以方便模块化程序设计,也就是说编写模块的时候不用理会发出的信号会被谁接收,接收后会干什么,同理不用你会发现这时你需要对着两个模块的结构都有了解才能进行下去。而使用了信号与槽就方便多了。信号和槽机制:(1)在QT技术中,信号与槽机制是它的核心内容,所以要想熟练地掌握QT编程,就必须能够熟练地运用信号和槽机制。(2)QT区别于其他不同的工具包的一个重要区别在于:信号和槽机制是一种相对高级的接口,它是应用在对象之间的通信的。同时也是QT的核心特性。(3)信号量和槽机制是独立于C+的QT的工具,是一种自定义的通信机制。信号(signals):(1)当一个具体的信号对它的客户或者是拥有者发生的内部的状态发生改变的时候,对号会被一个对象发射。那么,我们需要首先定义过这个信号的类以及它的派生类,才能够发生这个信号。(2)信号的申明跟C+中许多宏定义的申明是相同的,这个申明的步骤是在头文件中进行的。关键字Signals指出进入了信号申明区,然后用户就可以申明自己的信号了。信号和槽的关联 要想将一个对象的信号和另外一个对象的槽函数进行关联的时候,我们可以通过调用Qobject对象的connect函数来进行这一步骤。槽(slots)(1)槽唯一的特性在于它可以跟许许多多信号相关联,除此之外,就像普通的C+成员函数一样,可以被其他函数正常调用。(2)在槽函数中,跟普通的C+成员函数相同,它也分为三种类型。分别是:public slots、private slots、protected slots。(3)之前提到的,槽也是在头文件中进行申明的。信号和槽的关联断开能够连接,也就意味着在不需要的时候,我们可以人为的将这种连接断开,在QT中,使用disconnect函数来断开连接。其定义如下:bool QObject:disconnect (const QObject * sender,const char * signal,const Object * receiver,const char * Member)要注意的问题:(1)速度与效率并不能同时做到最好,我们能够做到的就是讲这种比例达到最大效益。虽说信号和槽的效率是极其搞得,但是相比真正的函数调用,它的灵活性更高,这也就意味着速度上会有所亏损。当然,这种亏损也是我们能够承受的范围之内的。(2)信号和槽机制如果程序员使用不同,同样会产生错误,有时候可能导致死循环。2 设计实现该项目在Main Window类为主窗体,以QMdiArea类为多文档区域,以QTextEdit类为子窗口不见,从而实现了一个多文档编辑器的应用。2.1 界面设计首先进行界面设计,这里主要是对主窗口菜单栏和工具拦的设计。打开Qt Creator,创建新的项目。新建Qt Gui应用,项目名称为myMdi,类名默认为MainWindow,基类默认为QMainWindow都不做改动。完成后双击mainwindow.ui文件,进行设计模式,然后添加各个菜单。设计菜单是如果将来触发这个菜单会弹出一个个对话框进行详细设置,那么就在这个菜单文本后面添加“”号。添加动作时,一定要使用动作名称和Action编辑器中所使用的名称保持一致。设计完菜单栏和工具拦后,向主窗口中心区域拖入一个MdiArea部件,并单击主窗口界面,按下Ctrl+G快捷键,使其处于山歌布局之中,可以看一下对象列表窗口,确保MdiArea部件的objectName是mdiArea,而文件菜单、编辑菜单、窗口菜单和帮助菜单的objectName分别是menuF、menuE、menuW和menuH。2.2 创建子窗口类为了实现多文档操作,需要向QMdiArea中添加子窗口,而为了可以更好的操作子窗口,必须子类化子窗口的中心部件,因为这里子窗口的中心部件使用了QTextEdit类,所以要实现自己的类,它必须集成子QTextEdit,然后再其中添加我们的功能函数往项目中添加新文件,模版选择“C+类”,类名为MdiChild,基类为QTexitEdit,类型信息选择继承自“QWidget”。完成后再mdichild.h如下代码:class MdiChild : public QTextEdit Q_OBJECTpublic: explicit MdiChild(QWidget *parent = 0); void newFile(); / 新建操作 bool loadFile(const QString &fileName); / 加载文件 bool save(); / 保存操作 bool saveAs(); / 另存为操作 bool saveFile(const QString &fileName); / 保存文件 QString userFriendlyCurrentFile(); / 提取文件名 QString currentFile()return curFile; / 返回当前文件路径protected: void closeEvent(QCloseEvent *event); / 关闭事件 void contextMenuEvent(QContextMenuEvent *e); / 右键菜单事件private slots: void documentWasModified(); / 文档被更改时,显示更改状态标志private: bool maybeSave(); / 是否需要保存 void setCurrentFile(const QString &fileName); / 设置当前文件 QString curFile; / 保存当前文件路径 bool isUntitled; / 作为当前文件是否被保存到硬盘上的标志;这个头文件声明11个函数,两个变量,用于新建、加载、保存、另存、关闭五个功能。2.2.1 新建文件操作newFile()新建窗口百年好;设置文件未被保存国“isUnititled = true;”;保存文件路径,给curFile赋初值;这只子窗口标题;关联文档内容改变信号到显示文档更改状态标志槽documentWasModifiled()。void MdiChild:newFile() / 新建文件操作 static int sequenceNumber = 1; / 设置窗口编号,因为编号一直被保存,所以需要使用静态变量 isUntitled = true; / 新建的文档没有被保存过 / 将当前文件命名为未命名文档加编号,编号先使用再加1 curFile = tr(未命名文档%1.txt).arg(sequenceNumber+); / 设置窗口标题,使用*可以在文档被更改后在文件名称后显示”*“号 setWindowTitle(curFile + * + tr( - 多文档编辑器); / 当文档被更改时发射contentsChanged()信号, / 执行我们的documentWasModified()槽函数 connect(document(), SIGNAL(contentsChanged(), this, SLOT(documentWasModified();void MdiChild:documentWasModified() /文档被更改时,窗口显示更改状态标志 / 根据文档的isModified()函数的返回值,判断我们编辑器内容是否被更改了 / 如果被更改了,就要在设置了*号的地方显示“*”号,这里我们会在窗口标题中显示 setWindowModified(document()-isModified();编辑器的内容是否被更改,可以使用QTextDocument类的isModified()函数获知,这里使用QTextEdit类的document()函数来获取它的QTextDocument类对象,然后使用setWindowModified()函数这是窗口更改状态标志“*”,如果参数为true,那么就会在标题中设置“*”号的的地方显示“*”,表示该文件已经被修改。2.2.2 加载文件操作loadFile()打开指定的文件,并读取文件内容到编辑器;设置当前文件setCurrentFile(),该函数可以获取文件路劲;完成文件和窗口状态的设置;关联文档内容改变信号到显示文档更改状态标志槽documentWasModifiled()。bool MdiChild:loadFile(const QString &fileName) / 加载文件 QFile file(fileName); / 新建QFile对象 if (!file.open(QFile:ReadOnly | QFile:Text) QMessageBox:warning(this, tr(多文档编辑器), tr(无法读取文件 %1:n%2.) .arg(fileName).arg(file.errorString(); return false; / 只读方式打开文件,出错则提示,并返回false QTextStream in(&file); / 新建文本流对象 QApplication:setOverrideCursor(Qt:WaitCursor); / 设置鼠标状态为等待状态 setPlainText(in.readAll(); / 读取文件的全部文本内容,并添加到编辑器中 QApplication:restoreOverrideCursor(); / 恢复鼠标状态 setCurrentFile(fileName); / 设置当前文件 connect(document(), SIGNAL(contentsChanged(), this, SLOT(documentWasModified(); return true;在加载文件操作中使用了QFile类为对象,他可以打开指定的文件,并且与QTextStream类配合使用,方便进行文件的读取和吸入操作。建立QMessageBox是使用了tr()函数,其中的“1%”和“2%”分别可以被后面的arg()重的fileName和file.errorString()代替,这样就乐意在字符串中使用变量了,在读取文件完成后还调用了setCurrentFile()函数,定义如下:void MdiChild:setCurrentFile(const QString &fileName) / 设置当前文件 / canonicalFilePath()可以除去路径中的符号链接,“.”和“.”等符号 curFile = QFileInfo(fileName).canonicalFilePath(); isUntitled = false; / 文件已经被保存过了 document()-setModified(false); / 文档没有被更改过 setWindowModified(false); / 窗口不显示被更改标志 / 设置窗口标题,userFriendlyCurrentFile()返回文件名 setWindowTitle(userFriendlyCurrentFile() + *);QString MdiChild:userFriendlyCurrentFile() / 提取文件名 return QFileInfo(curFile).fileName(); / 从文件路径中提取文件名上述函数将加载文件的路径保存到curFile中,然后进行状态设置,从文件路径中提取出文件名,使标题更加清晰和友好。2.2.3 保存操作sava()如果文件没有被保存过(用isUnititled判断),执行另存为操作saveAs();否则直接保存文件saveFile(),该函数先打开指定文件,然后将编t辑器的内容写入该文件,最后设置当前文件setCurrentFile().bool MdiChild:save() / 保存操作 if (isUntitled) / 如果文件未被保存过,则执行另存为操作 return saveAs(); else return saveFile(curFile); / 否则直接保存文件 这里要先使用isUnititled判断文件是否被保存过,如果没有,则要先进行另存为操作,如果已保存过,那么直接写入文件就可以了。2.2.4 另存为操作saveAs()从文件对话框获取文件路径;如果路径不为空,则保存文件saveFile().bool MdiChild:saveAs() / 另存为操作 / 获取文件路径,如果为空,则返回false QString fileName = QFileDialog:getSaveFileName(this, tr(另存为),curFile); if (fileName.isEmpty() return false; return saveFile(fileName); / 否则保存文件bool MdiChild:saveFile(const QString &fileName) / 保存文件 QFile file(fileName); if (!file.open(QFile:WriteOnly | QFile:Text) QMessageBox:warning(this, tr(多文档编辑器), tr(无法写入文件 %1:n%2.) .arg(fileName).arg(file.errorString(); return false; QTextStream out(&file); QApplication:setOverrideCursor(Qt:WaitCursor); out accept(); else / 否则忽略该事件 event-ignore(); bool MdiChild:maybeSave() / 是否需要保存 if (document()-isModified() / 如果文档被更改过 QMessageBox box; box.setWindowTitle(tr(多文档编辑器); box.setText(tr(是否保存对“%1”的更改?) .arg(userFriendlyCurrentFile(); box.setIcon(QMessageBox:Warning); / 添加按钮,QMessageBox:YesRole可以表明这个按钮的行为 QPushButton *yesBtn = box.addButton(tr(是(&Y),QMessageBox:YesRole); box.addButton(tr(否(&N),QMessageBox:NoRole); QPushButton *cancelBtn = box.addButton(tr(取消),QMessageBox:RejectRole); box.exec(); / 弹出对话框,让用户选择是否保存修改,或者取消关闭操作 if (box.clickedButton() = yesBtn)/ 如果用户选择是,则返回保存操作的结果 return save(); else if (box.clickedButton() = cancelBtn) / 如果选择取消,则返回false return false; return true; / 如果文档没有更改过,则直接返回true关闭窗口的时候需要进行文档是否被改过的判断,弱国文档被更改,则弹出警告框,这里为了使警告框中的按钮可以显示中文用了自定义按钮。2.3 实现菜单功能2.3.1 更新菜单状态在mainwingow.h文件添加爱泪MdiChild的前置申明:“class Mdichild;”,然后天界寺有槽private slots;void updateMenus(); /更新菜单再添加private私有变量和函数:QAction *actionSeparator; / 分隔符MdiChild *activeMdiChild(); / 活动窗口这里的actionSeparator;动作用于创建一个间隔器,将来在查ungkoucaidan中显示窗口列表是可以用它与前面的菜单动作分隔开。实现如下:actionSeparator = new QAction(this); / 创建间隔器动作 actionSeparator-setSeparator(true); / 在其中设置间隔器 updateMenus(); / 更新菜单connect(ui-mdiArea,SIGNAL(subWindowActivated(QMdiSubWindow*),this, SLOT(updateMenus(); / 当有活动窗口时更新菜单这里初始化actionSeparator动作,然后执行更新次啊但函数,并关联多文档区域的活动子窗口信号到更新菜单草上,每当更换活动子窗口时,都会更换活动子窗口是,都会更新
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年证券从业资格证金融工具解析试题及答案
- 项目管理专业资格考试能力动态试题及答案
- 注册会计师考试的关键准备细则试题及答案
- 注册会计师考试2025年合规风险管理流程探讨试题及答案
- 微生物与疾病预防的关系试题及答案
- 风险应对策略在项目管理中的运用试题及答案
- 证券从业资格证的复习心态调整技巧试题及答案
- 证券投资决策模型的应用试题及答案
- 临床微生物学课程总结试题及答案
- 股票价值评估的基本方法试题及答案
- 福建省仙游木兰抽水蓄能电站500kV开关站工程环境影响报告书
- MotionView-MotionSolve应用技巧与实例分析
- 集装箱配载软件macs3说明书
- 奥氏体不锈钢对接焊接接头的超声检测
- 南京雨花台烈士陵园
- 2023超疏水表面的机械稳定性测试方法
- 创意绘画《“浪漫的化身”薰衣草》课件
- 过滤式消防自救呼吸器-安全培训
- 胸腔积液诊断的中国专家共识(2022版)解读
- 既有建筑外观改造和景观环境综合整治技术导则
- PCB的DFM评审报告模板
评论
0/150
提交评论