基于Qt的电子相册说明书_第1页
基于Qt的电子相册说明书_第2页
基于Qt的电子相册说明书_第3页
基于Qt的电子相册说明书_第4页
基于Qt的电子相册说明书_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

毕业设计说明书基于QT的记事本和电子相册学生姓名:学号:学院:专业:指导教师:2023年6月基于QT的记事本和电子相册摘要越来越多的设备需要一个图形化的人机接口界面〔GUI〕,良好的人机交互界面是各个软件系统设计的一个关键技术,尤其是在给广阔人们的使用中,对程序的实用性、美观性和视听娱乐性提出了更高的要求。而记事本和电子相册以其实用性和良好的欣赏性逐渐成为人们查看和使用中不可或缺的组成局部。开发基于Qt的界面美观、功能丰富的记事本和电子相册,具有一定的实用意义和价值。本文的目标是设计和实现基于Qt的记事本和电子相册。论文首先介绍了Qt的优点和Qt开发环境的搭建,着重分析了Qt在软件开发中的编程机制。并根据嵌入式应用的特点对基于Qt的记事本和电子相册进行了设计需求分析、具体界面的设计和整体结构的设计。本课题根据记事本和电子相册的算法,设计并实现了记事本的相关功能〔如:新建、翻开、编辑和删除文件等〕和电子相册的相关功能。最后对关于论文进一步工作的方向进行了简要的讨论。关键字:Qt,图形用户界面,记事本,电子相册 EmbeddedterminalapplicationprogramdevelopmentbasedonQT——DevelopmentofnotepadandelectronicalbumAbstractMoreandmoreembbededEmbeddedTerminalneedgraphicsuserinterface(GUI).AgoodHuman-ComputerInteractioninterfaceisthekeytechnologyofembeddedsystemdesign.Higherdemandsofthepracticality,aestheticsandaudio-visualentertainmentofembeddedterminalareneeded,especiallyinembbededsystemhandhelddevice.Notepadandelectronicphotoalbumarebecominganintegralpartofembeddeddevicefortheirpracicalityandgoodviewing.Ithassomepracticalsignificanceandvaluetodevelopanotepadandanalbumwithbeautifulinterface,richfunctionsandgoodinteractionbasedonembeddedterminal.Theaimofthispaperistodesignandimplementanotepadandanalbumintheembededterminalenvironment.ThispaperpresentedtheadvantageofLinuxandthebuildingofQTdevelopingenvironment,focusedontheprogrammingmechanismofdevelopingsoftwarewithQt.Itanalysedtheneedsofthedesign,designedthespecificinterfaceandoverallstructureofnotepadandalbumintheembededterminalenvironmentaccordingtofeaturesofembeddedapplication.Thisprojectdesignedandimplementedtherelevantfunctionsofnorepad(suchasnewfile,openfile,editfileanddeletefile)aswellastherelevantfunctionsofalbum(suchasenlarge、minify、rotateandmovethepicture)basedonthealgorithmsofnotepadandalbum.Finally,briefdisscusionaboutthefurtherreaserchofthispaperwaspresented.Keywords:Qt,GUI,notepad,alb目录1引言1课题研究背景和意义11.2基于Qt的软件技术开展现状和未来11.2.1标志性的产品已露头角11.2.2基于Qt的软件技术面临挑战21.3课题研究内容22Qt简介32.1Qt开发工具简介32.1.1Qt主要特性32.1.2Qt编程机制简介33嵌入式终端应用程序之记事本和电子相册架构设计63.1记事本架构设计63.1.1记事本设计需求63.1.2记事本界面设计63.1.3记事本结构设计93.2电子相册架构设计103.2.1电子相册设计需求103.2.2电子相册界面设计113.2.3电子相册结构设计134算法设计和实现154.1记事本主要算法设计和实现154.1.1记事本类结构设计154.1.2记事本功能实现154.1.3记事本代码实现164.2电子相册主要算法设计和实现214.2.1电子相册类结构设计214.2.2电子相册功能实现224.2.3电子相册代码实现235总结31参考文献32致谢331引言课题研究背景和意义随着各种电子产品的不断开展和不断的进步,现在往往要求用户操作系统有图形化的功能。一个拥有良好舒适的图形化界面的程序可以使用户更加喜欢和更好的运用软件进行操作[1]。虽然市场上现在已经有了众多的优秀的GUI应用软件,但随着近年来计算机技术的迅速开展,当新硬件、新技术出现时,计算机的体系结构、指令系统和操作系统都可能发生相应的改变,这势必会导致一局部应用软件在新环境下无法正常运行[2]。如果舍弃原有软件而重新开发,将会消耗大量的人力和资金,而且浪费了许多成熟的软件成果。而Qt是1991年奇趣科技开发的一个跨平台的C++图形用户界面应用程序框架[3]。它提供应应用程序开发者简历艺术级的图形用户所需的所有功能。Qt很容易扩展,并且允许真正地组件编程。在源代码级上实现了跨平台特性,极大的支持了跨平台通用软件的开发。Qt可以用同一个源程序在不同平台上编译链接,生成目标代码,并取得相同的运行效果,称为“一次编写,随处编译〞,利用这种方法充分实现了程序的跨平台运行[4]。这种基于源代码的跨平台特性不仅解决了性能的问题,而且可以发挥各个平台的优势,充分利用每个平台自身的特点;并且既可以在新环境下实现原有软件的功能和特点,减少开发费用,还可以改良原有软件的缺乏,增加新的需求,从而提高软件的质量,延长软件生命期。因此,基于Qt的应用程序软件的开发是一个非常有意义的课题,具有重要的研究和商业价值。1.2基于Qt的软件技术开展现状和未来1.2.1标志性的产品已露头角计算机应用的普及、互联网技术的实用以及纳米微电子技术的突破,正有力推动着21世纪工业生产、商业活动、科学实验和家庭生活等领域自动化和信息化进程。全过程自动化产品制造、大范围电子商务活动、高度协同科学实验以及现代化家庭起居,为嵌入式产品造就了崭新而巨大的商机。除了沟通信息高速公路的交换机、路由器和Modem,构建CIMS所需的DCS和机器人以及规模较大的家用汽车电子系统[5]。最有量产效益和时代特征的嵌入式产品应数因特网上的信息家电(InternetAppliances),如Web可视、Web游戏机、WebPDA(俗称电子商务、商务通)、WAP、以及多媒体产品,如STB(电视机顶盒)、DVD播放机、电子阅读机[6]。1.2.2基于Qt的软件技术面临挑战 以信息家电为代表的互联网时代基于Qt的产品,不仅为软件应用市场展现了美好前景,注入了新的生命;同时也对软件技术提出新的挑战。这主要包括:支持日趋增长的功能密度、灵活的网络联接、轻便的移动应用和多媒体的信息处理,此外,当然还需对付更加剧烈的市场竞争。1.3课题研究内容针对各种不同应用平台产品的高度个性化,其外观、与用户交互的界面千差万别的特点,故而系统的设计目标是意在打造一个能在各产品用户端运行、通用的、可以方便的支持各种控件、各种图形格式,具有体积小、可裁剪、可移植的这样一个面向用户的应用程序系统,使各种不同的设备能具有美观的用户界面,相比照拟丰富的功能,操作起来简单而又直观[7]。本文通过对Window和Qt的分析,在Window下Qt的根底上,开发了面向Windows终端的记事本和电子相册应用软件。记事本可以将文件下的记事本文件以其原有存放的形式显示出来,并可以实现记事本文件的新建、翻开、编辑和内容保存等功能。电子相册不仅支持一些图片文件的浏览,删除等的功能而且还支持图片的放大、缩小、旋转以及图片以幻灯片形式播放和暂停等功能。他们体积小,移植方便,适用于很多的系统[8]。此外它作为一种小型GUI解决方案,可用于那些对GUI大小要求苛刻的各种应用系统中[9]。2Qt简介2.1Qt开发工具简介2.1.1Qt主要特性Qt是一个跨平台的C++图形用户界面库,由挪威TrollTech公司开发,目前包括Qt/X11、基于Framebuffer的Qt/Embedded、快速开发工具QtDesigner以及国际化工具QtLinguist等。人们所熟知的Linux下面的KDE环境就是基于Qt开发而成的。Qt支持Unix和Linux系统以及Windows系统。Qt的主要特点有:面向对象,很容易扩展,并且允许真正的组件编程;Qt对各个模块进行了良好的封装,使各模块可重用性较好;优良的跨平台特性,使用Qt类编写的程序可以实现“一次编码,到处编译〞[10],极大的降低了跨平台开发的难度;构件支持,对于对象间通信,Qt没有采用函数回调的方法,而是采用了一种全新并且可选的被称为“信号与槽〞的对象间通信机制,通过一个对象信号的发射,另一个槽函数的响应,使各个对象之间的通信平安而且高效。Qt的这些特点使它非常适合于真正的构件编程,同时使各个组件之间的协同工作变得十分简单,并且Qt是直接基于Xlib的,不依赖Motif工具包,所以它的执行效率比一般的基于平台的代码的执行效率要高。2.1.2Qt编程机制简介〔1〕QT的信号与槽机制介绍信号和槽机制是QT的核心机制,要精通QT编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它工具包的重要地方。信号和槽是QT自行定义的一种通信机制,它独立于标准的C/C++语言,因此要正确的处理信号和槽,必须借助一个称为moc〔MetaObjectCompiler〕的QT工具,该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码。在我们所熟知的很多GUI工具包中,窗口小部件(widget)都有一个回调函数用于响应它们能触发的每个动作,这个回调函数通常是一个指向某个函数的指针[11]。但是,在QT中信号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程序更为简洁明了。信号和槽能携带任意数量和任意类型的参数,他们是类型完全平安的,不会像回调函数那样产生coredumps[12]。所有从QObject或其子类(例如Qwidget)派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射(emit)出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号[13]。这就是真正的信息封装,它确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。信号和槽的机制是类型平安的:一个信号的签名必须与它的接收槽的签名相匹配。〔实际上一个槽的签名可以比它接收的信号的签名少,因为它可以忽略额外的签名。〕因为签名是一致的,编译器就可以帮助我们检测类型不匹配。它以警告的方式报告类型错误,而不会使系统产生崩溃。信号和槽是宽松地联系在一起的:一个发射信号的类不用知道也不用注意哪个槽要接收这个信号[14]。Qt的信号和槽的机制可以保证如果你把一个信号和一个槽连接起来,槽会在正确的时间使用信号的参数而被调用。信号和槽可以使用任何数量、任何类型的参数。它们是完全类型平安的:不会再有回调核心转储(coredump)。你可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接,甚至于将一个信号与另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。总体来看,信号和槽构成了一个强有力的组件编程机制。如果一个类要使用信号与槽机制,它就必须是从QObject或QObject的子类继承,而且类的定义必须加上Q_OBJECT宏。signals、slots和emit是Qt特有的关键字,分别用来表示信号、槽、和发送信号,移除这些关键字和预处理程序,就可以使用标准的C++编译器。槽同其他函数一样也具有访问权限,只是槽的访问权限决定了谁可以和它相连,如一个publicslots:包含了任何信号都可以相连的槽(AndrewKrause,2007)。一个protectedslots:包含了只有这个类和它的子类的信号才能连接的槽。这就是说这些槽只是类的实现的一局部,而不是它和外界的接口。一个privateslots:包含了只有这个类本身的信号可以连接的槽,甚至它的子类都没有获得连接的权利。(2)Qt元对象系统Qt中的元对象系统是用来处理对象间通讯的信号/槽机制、运行时的类型信息和动态属性系统。它基于以下三类:QObject类、类声明中的私有段中的Q_OBJECT宏、元对象编译器〔moc〕。moc读取C++源文件。如果它发现其中包含一个或多个类的声明中含有Q_OBJECT宏,它就会给含有Q_OBJECT宏的类生成另一个含有元对象代码的C++源文件。这个生成的源文件可以被类的源文件包含〔#include〕到或者和这个类的实现一起编译和连接。除了提供对象间通讯的信号和槽机制之外〔介绍这个系统的主要原因〕,QObject中的元对象代码实现其它特征:className()函数在运行的时候以字符串返回类的名称,不需要C++编译器中的本地运行类型信息〔RTTI〕的支持。inherits()函数返回这个对象是否是一个继承于QObject继承树中一个特定类的类的实例。tr()和trUtf8()两个函数是用于国际化中的字符串翻译。setProperty()函数和property()函数,这两个函数是用来通过名称动态设置和获得对象属性的。metaObject()函数返回这个类所关联的元对象。虽然使用QObject作为一个基类而不使用Q_OBJECT宏和元对象代码是可以的,但是如果Q_OBJECT宏没有被使用,那么这里的信号和槽以及其它特征描述都不会被提供。根据元对象系统的观点,一个没有元代码的QObject的子类和它含有元对象代码的最近的祖先相同。举例来说就是,className()将不会返回你的类的实际名称,返回的是它的这个祖先的名称。故强烈建议QObject的所有子类使用Q_OBJECT宏,而不管它们是否实际使用了信号、槽和属性[15]。3嵌入式终端应用程序之记事本和电子相册架构设计3.1记事本架构设计3.1.1记事本设计需求记事本可以讲文件下的记事本文件按文本的形式显示出来,并可以实现记事本文件的新建、翻开、编辑和文本的删除等功能;记事本可以根据文件内容的多少来实现文本的滚动显示,可以通过计算机键盘对文本进行快速的编辑等。(1)记事本新建功能:可以创立一个新的记事本文件。(2)翻开记事本的功能:根据文件列表选择翻开指定的文件,翻开指定文件时,显示翻开文件的文件内容在文件编辑界面上,文件内容过多时可以滚动显示,并在文件编辑界面的上方滚动显示翻开的文件的文件名。(3)控制记事本编辑格式功能:编辑文件时,文本内容输入到当前界面的右端边界处自动换行,也可以利用键盘操作执行换行动作。输入的文本内容多于当前屏幕显示范围时出现纵向滚动条,随着文本输入滚动显示内容。(4)记事本内容修改提示功能:假设在翻开的文件中对其内容进行了修改,在关闭文件时将会提示文件的内容已经被修改的消息,用户可选择是否保存修改后的内容。(5)记事本内容增删改查功能:在翻开记事本文件后,可以对记事本文件中的内容进行编辑,如增加、删除、修改、撤销修改、查找等。这一旦发生变化,那么在选择保存后,文件列表的文件也发生了改变。(6)记事本保存功能:可以对操作了的记事本文件进行保存,在选择保存记事本文件后,文件名立即显示在文件列表上。3.1.2记事本界面设计(1)新建文件编辑界面:如下图,界面上方显示功能界面名称。工具栏上面有各种操作的按钮,中间区域为文本编辑区,用于接收文本的输入,界面下方有提示和日期时间的显示。界面可以实现扩大缩小的功能。图3.1记事本界面〔2〕翻开文件内容显示界面:如图图3.2所示,界面中间区域为文件内容的显示区,可以接收文本的编辑和修改。界面下方左侧为显示文件导入完毕提示。图3.2翻开记事本界面记事本功能菜单设计:如图3.3所示,记事本工具栏上依次为新建按钮、翻开按钮、保存按钮、剪切按钮、复制按钮、粘贴按钮、撤销按钮、查找按钮以及返回上一界面按钮。图3.3记事本菜单界面记事本查找消息框设计:如图3.4所示,在输入框中输入要查找的内容,点击查找下一个按钮,就会在显示文本区域找到要查找的内容并且会标记出来。图3.4记事本查找界面记事本消息提示框设计:如图3.5所示,消息提示框的显示区域显示提示动画和提示的内容。界面的下方左侧为确认保存功能按钮,下方中间为不保存按钮,下方右侧为取消操作按钮。图3.5记事本保存界面3.1.3记事本结构设计如下图,记事本界面是记事本的入口和出口。记事本通过调用文件列表功能菜单对文件执行各种操作。在文件列表功能菜单中根据所选择的菜单条目进入相应的功能界面,如新建文件编辑界面、文件显示内容界面等。各个界面都有自己的功能菜单,通过调用自己的功能菜单对当前界面进行下一步的操作,如当新建文件界面显示时,可通过菜单按钮进行增加、删除、修改和查找内容的操作;当翻开文件时在文件内容的显示界面上,,可通过菜单按钮进行增加、删除、修改和查找内容的操作以及可通过修改文件提示框选择是否保存修改后的文件内容。记事本界面记事本界面功能选择翻开读取文件内容建立新文件功能选择功能选择增加内容删除内容修改内容查找内容图3.6记事本结构设计3.2电子相册架构设计3.2.1电子相册设计需求电子相册支持jpg、png、gif、xpm和bmp格式图片的浏览,并可以对图片进行放大、缩小或旋转角度显示。电子相册还支持幻灯片模式浏览图片,并可以对图片进行删除等操作。在图片文件所在目录读取所有扩展名为jpg、xpm、png、bmp、gif格式的图片文件,并将读取的图片文件按顺序存放起来,在界面上显示放入的第一张图片。删除图片功能:对当前界面上显示的图片可执行删除操作,删除以后所查看的图片中不再显示已删除的图片并且显示图片位置和总数目的数据也相应的发生变化。浏览图片功能:对当前显示的图片可以执行浏览的功能,假设图片原本大小超过图片浏览区域〔即相框〕的大小,那么会自动调整变成适应图片浏览区域的最大尺寸。假设图片原本大小没有超过图片浏览区域大小,那么以原始尺寸在图片浏览区域显示。可对翻开的图片进行放大、缩小、向左旋转全屏模式与返回原始尺寸等一系列的浏览模式操作。图片放大功能:在当前图片尺寸大小的根底上,图片可逐级放大,以尺寸的0.25倍递增,最大可放大到翻开图片时显示的初始尺寸的3倍。图片缩小功能:在当前图片尺寸大小的根底上,图片可逐级缩小。最小可缩小到翻开图片时显示的初始尺寸的0.333倍。图片旋转功能:翻开图片后,可在图片的任意状态下对图片进行旋转操作。可在当前状态下,将图片向左旋转,每次旋转角度差值为90°。图片旋转后会自动适应窗口大小,完整显示图片。图片全屏显示功能:可以将图片执行全屏显示。为了支持点击操作,全屏显示时不覆盖相关功能按钮。幻灯片模式自动浏览功能:可从当前选定的图片开始执行自动播放图片功能,初始设定播放速度为1秒间隔。图片查看功能:可以按上一张、下一张的按钮用户自行的对图片进行查看。给用户提供友好的图形交互界面,并合理安排界面元素布局,使其美观并且方便用户操作3.2.2电子相册界面设计电子相册功能菜单设计:如图3.7所示,界面上方显示功能界面名称,中间显示区域为所加载的图片的显示。下面功能菜单栏依次为加载照片文件按钮、原图片大小显示按钮、图片放大按钮、图片和屏幕一样大小按钮、图片缩小按钮、图片旋转按钮、显示上一张图片按钮、图片显示当前位置和总照片数label、显示下一张图片按钮、删除当前所显示图片按钮、播放图片幻灯片按钮、暂停图片幻灯片按钮、返回上一界面按钮和退出系统按钮。图3.7电子相册界面如图3.8所示,在点下旋转按钮以后,图片会顺时针旋转90度显示出来。使对图片查看有更好的便捷。图3.8图片旋转效果如图3.9所示,在点下放大按钮后,图片将放大,在放大到一定比例后,放大按钮将不可点击。图3.9图片放大效果如图3.10所示,在点下缩小按钮后,图片将缩小,在缩小到一定比例后,缩小按钮将不可点击。图3.10图片缩小如图3.11所示,在点下恢复按钮后,图片将填充整个界面,此时,不可以进行放大,缩小功能,只有在点下原图按钮后放大缩小按钮才可以继续使用。图3.11图片适应屏幕3.2.3电子相册结构设计如下图,图片列表界面为电子相册的入口和出口。通过图片列表功能菜单,可执行翻开图片进行浏览的功能,并根据所选择的功能进入图片浏览界面。进入图片浏览界面可通过图片浏览功能菜单,对当前显示的图片执行各种操作,从而进入相应的图片浏览界面。放大图片的显示,缩小图片的显示,旋转图片的显示,删除当前图片图片全屏的显示和自动浏览图片的显示均将显示在图片浏览界面。而各种模式下的图片浏览界面下,均可以通过功能菜单对其他浏览模式进行选择。翻开图片翻开图片功能选择正常显示图片全屏显示图片自动浏览显示图片放大显示图片缩小显示图片图片旋转图片删除图片列表图3.12电子相册结构设计4算法设计和实现4.1记事本主要算法设计和实现4.1.1记事本类结构设计图4.1记事本类图4.1.2记事本功能实现记事本界面用到的控件主要有QLabel、QToolButton、QTextEdit等。记事本文件列表的实现:首先扫描文件夹下的所有文件,包括隐藏的所有文件名,过滤记事本文件,并将这些记事本文件名根据创立时间的先后进行排序存储到文件链表中,将文件链表中的所有文件显示在文件列表界面。流程图如图17。功能菜单的实现:在记事本设计中有3个功能菜单界面,其中翻开和新建的功能菜单均继承自记事本文件列表界面的功能菜单,这三个界面都含有一个QListBox控件,但是菜单项不同,并根据不同的菜单项实现不同的功能。流程图如图18。新建文件的实现:首先提示输入文件名,并检查文件名的合法性。如果文件名不符合要求,那么设置文件名的输入无效,并提示重新输入。如果不输入文件名那么提供默认的文件名,进入文本编辑界面,然后按照界面的宽度对文本输入进行限定,到界面宽度最大值时自动换行。并且使文本保存时输入到物理设备上时支持unicode编码。流程图如图19。翻开文件功能的实现:从文件列表选定翻开的文件,然后将文件内容读到QTextStream中再显示在QTextEdit中,并且规定显示格式。如果文件内容被修改后,提示文件是否需要保存。如果通过菜单项选择择翻开下一个文件,那么查找到当前文件的下一个文件,并将其文件内容显示于界面显示区域上。4.1.3记事本代码实现voidTest::newFile(){if(maybeSave()){ui->textEdit->clear();setCurrentFile("");}}//判断是否选择保存内容boolTest::maybeSave(){if(ui->textEdit->document()->isModified()){QMessageBox::StandardButtonret;ret=QMessageBox::warning(this,tr("Application"),tr("Thedocumenthasbeenmodified.\n""Doyouwanttosaveyourchanges?"),QMessageBox::Save|QMessageBox::Discard|QMessageBox::Cancel);if(ret==QMessageBox::Save){qDebug()<<"2";returnsave();}elseif(ret==QMessageBox::Cancel){qDebug()<<"3";returnfalse;}}returntrue;}//保存内容如果原先不存在那么跳转到saveAs()弹出对话框进行保存如果存在那么使用当前的路径boolTest::save(){if(curFile.isEmpty()){returnsaveAs();}else{qDebug()<<"6";returnsaveFile(curFile);}}//弹出保存的对话框boolTest::saveAs(){QStringfileName=QFileDialog::getSaveFileName(this,tr("请确定"),"/","*.txt");qDebug()<<fileName;if(fileName.isEmpty()){qDebug()<<"7";returnfalse;}qDebug()<<"8";returnsaveFile(fileName+".txt");}boolTest::saveFile(constQString&fileName){QFilefile(fileName);//qDebug()<<"fileN";if(!file.open(QFile::WriteOnly|QFile::Text)){QMessageBox::warning(this,tr("Application"),tr("Cannotwritefile%1:\n%2.").arg(fileName).arg(file.errorString()));returnfalse;}QTextStreamout(&file);out<<ui->textEdit->toPlainText();setCurrentFile(fileName);ui->label->setText(tr("Filesaved"));qDebug()<<"10";returntrue;}//设置路径voidTest::setCurrentFile(constQString&fileName){curFile=fileName;ui->textEdit->document()->setModified(false);setWindowModified(false);QStringshownName=curFile;if(curFile.isEmpty())shownName="wangrui.txt";setWindowFilePath(shownName);}//翻开文件voidTest::openFile(){if(maybeSave()){QStringfileName=QFileDialog::getOpenFileName(this,tr("请选择"),"/","*.txt");if(!fileName.isEmpty())loadFile(fileName);}}voidTest::loadFile(constQString&fileName){QFilefile(fileName);if(!file.open(QFile::ReadOnly|QFile::Text)){QMessageBox::warning(this,tr("Application"),tr("Cannotreadfile%1:\n%2.").arg(fileName).arg(file.errorString()));return;}QTextStreamin(&file);ui->textEdit->setPlainText(in.readAll());setCurrentFile(fileName);ui->label->setText(tr("Fileloaded"));}voidTest::about(){QMessageBox::about(this,tr("AboutApplication"),tr("ThisProjectismadeby<b>WangRui</b>"));}voidTest::back(){this->hide();MainWindow*mw=newMainWindow;mw->show();}voidTest::time(){QDateTimecurrent_date_time=QDateTime::currentDateTime();QStringcurrent_date=current_date_time.toString("yyyy-MM-ddhh:mm:ssddd");ui->label_2->setText(current_date);}voidTest::find()//查找{QDialog*findDlg=newQDialog(this);findDlg->setWindowTitle(tr("查找"));find_textLineEdit=newQLineEdit(findDlg);QPushButton*find_Bth=newQPushButton(tr("查找下一个"),findDlg);QHBoxLayout*layout=newQHBoxLayout(findDlg);layout->addWidget(find_textLineEdit);layout->addWidget(find_Bth);findDlg->show();connect(find_Bth,SIGNAL(clicked()),this,SLOT(show_findText()));}voidTest::show_findText(){QStringfindText=find_textLineEdit->text();if(!ui->textEdit->find(findText,QTextDocument::FindBackward)){QMessageBox::warning(this,tr("查找"),tr("找不到%1").arg(findText));}}4.2电子相册主要算法设计和实现4.2.1电子相册类结构设计图4.2电子相册类图4.2.2电子相册功能实现用户进入电子相册后,首先需要点翻开按钮选择文件夹中的照片。图片由imageList[]存放,将从当前目录下得到jpg、xpm、png、gif、bmp格式的图片存入链表中,通过load函数加载图片到一个QPixmap类型的变量中,然后将此变量与Label关联起来,以实现图片在Label上的显示。值得注意的一点是,此Label上加载的图片均为真实图片的缩略图,而不是图片本身。如果图片的缩略图已经存在,那么将缩略图直接显示在Label上,如果缩略图不存在,那么生成图片的缩略图。如果该图片文件为非法图片格式文件,那么在该Label上载入一个标志着读取图片文件失败的图片。缩略图是图片的真实缩影,在刚翻开图片显示时保持原图片的比例。删除图片功能实现:在对当前图片界面上要进行删除操作时,需注意两点,一点就是待删除的图片是否是图片列表的最后一张图片,假设是的话,那么删除图片后,被删除图片的前一张图片呈现出在显示图片界面上。否那么,删除图片后,被删除图片的后一张呈现在显示图片界面上,且此图片删除后,图片文件链表中删除图片节点,其列表界面中图片的位置要统一向前移动一个位置图片的放大功能的实现:设定scaleImag()来记录放大的倍数,并且当放大到最大倍数时,将菜单项上的“放大〞按钮变成不可点击的状态,并且根据放大倍数在浏览区域的相框上绘制图片。图片缩小功能的实现:可在图片的任意大小状态下进行缩小,直到图片缩小到初始翻开图片显示尺寸的0.333倍大小。缩小图片时要保证缩小后的图片依然居于相框中间位置。在图片非全屏模式和全屏模式两种情况下,判定当前状态的图片与初始时显示的位置移动的距离大小,并根据不同的图片旋转角度,据此距离大小计算并设定相应的图片在相框中的位置坐标。图片移动功能实现:图片在放大到1.0倍以上时,可进行图片在相框内的上下或左右移动显示。图片在全屏模式下选择放大时图片也可以进行上下或左右移动显示。相框内图片显示功能的实现:不同的选择下,相框内的图片显示状态是不同的。对于图片的显示需要考虑的情况有是否是全屏模式,当前的缩放倍数和当前的旋转角度,并需要根据判断图片是否移动来对显示边界进行检测及计算。根据图片缩放和旋转参数和检测到的移动距离,利用矩阵计算出新图片所需的各个参数,根据这些参数生成显示在相框内的图片。最后将图片绘制在相框内,即当前的图片浏览区内。4.2.3电子相册代码实现voidImageShow::scaleImage(doublefactor){scaleFactor*=factor;imageLabel->resize(scaleFactor*imageLabel->pixmap()->size());adjustScrollBar(scrollArea->horizontalScrollBar(),factor);adjustScrollBar(scrollArea->verticalScrollBar(),factor);ui->actionBig->setEnabled(scaleFactor<3.0);ui->actionSmall->setEnabled(scaleFactor>0.333);}voidImageShow::adjustScrollBar(QScrollBar*scrollBar,doublefactor){//qDebug()<<factor;scrollBar->setValue(int(factor*scrollBar->value()+((factor-1)*scrollBar->pageStep()/2)));}voidImageShow::fangDa(){scaleImage(1.25);}voidImageShow::suoXiao(){scaleImage(0.8);}voidImageShow::fitToWindow(){scrollArea->setWidgetResizable(true);ui->actionBig->setEnabled(false);ui->actionSmall->setEnabled(false);ui->actionOpen->setEnabled(false);}voidImageShow::normal(){scrollArea->setWidgetResizable(false);ui->actionBig->setEnabled(true);ui->actionSmall->setEnabled(true);ui->actionOpen->setEnabled(true);imageLabel->adjustSize();scaleFactor=1.0;}//控件的失效与否voidImageShow::hideView(boolb){ui->actionFitToWindow->setEnabled(b);ui->actionBig->setEnabled(b);ui->actionSmall->setEnabled(b);ui->actionNormal->setEnabled(b);ui->actionXuanZuan->setEnabled(b);ui->actionDown->setEnabled(b);ui->actionUpper->setEnabled(b);ui->actionBegin->setEnabled(b);ui->actionStop->setEnabled(b);ui->actionDelete->setEnabled(b);}//使图片旋转90度voidImageShow::xuanZuan(){QMatrixmatrix;matrix.rotate(90.0);pix=pix.transformed(matrix,Qt::FastTransformation);imageLabel->setPixmap(pix);}//翻开图片voidImageShow::open(){intk=0;QStringListlist=QFileDialog::getOpenFileNames(this,tr("请选择"),"/","*.png*.jpg*.gif*.xpm*.bmp");for(it=list.begin();it<list.end();it++){imageList[k]=*it;k++;}j=list.size()-1;image_sum=QString::number(k);image_positon=QString::number(1);ui->actionNumber->setText(tr("%1/%2").arg(image_positon).arg(image_sum));pix.load(imageList[i]);imageLabel->setPixmap(pix);scaleFactor=1.0;imageLabel->adjustSize();hideView(true);ui->actionStop->setEnabled(false);}//下一张图片voidImageShow::down(){timer.stop();i=i+1;if(i>j)i=0;pix.load(imageList[i]);imageLabel->setPixmap(pix);image_positon=QString::number(i+1);ui->actionNumber->setText(tr("%1/%2").arg(image_positon).arg(image_sum));}//上一张图片voidImageShow::upper(){timer.stop();i=i-1;if(i<0)i=j;pix.load(imageList[i]);imageLabel->setPixmap(pix);//qDebug()<<pix;image_positon=QString::number(i+1);ui->actionNumber->setText(tr("%1/%2").arg(image_positon).arg(image_sum));}//图片的加载voidImageShow::imageShow(){pix.load(imageList[i]);//先下载图片pix=pix.scaled(imageLabel->width(),imageLabel->height(),Qt::KeepAspectRatio);//设置显示图片的大小和label的大小一致imageLabel->setPixmap(pix);//将图片显示在面板上image_positon=QString::number(i+1);ui->actionNumber->setText(tr("%1/%2").arg(image_positon).arg(image_sum));i++;if(i>j)i=0;}//照片开始播放voidImageShow::begin(){timer.start(1000);//每隔一秒开始显示一张图片ui->actionBegin->setEnabled(false);ui->actionStop->setEnabled(true);ui->actionOpen->setEnabled(false);}//照片播放的暂停voidImageShow::stop(){timer.stop();ui->actionBegin->setEnabled(true);ui->actionStop->setEnabled(false);ui->actionOpen->setEnabled(true);}voidImageShow::back(){this->hide();MainWindow*mw=newMainWindow;mw->show();}//删除图片voidImageShow::deletePicture(){pix.load(imageList[i]);if(j>=0){intm;imageList[i].remove(i,1);for(m=i;m<imag

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论