首页 基于qt的图像格式转换器设计与实现论文

基于qt的图像格式转换器设计与实现论文

举报
开通vip

基于qt的图像格式转换器设计与实现论文基于qt的图像格式转换器设计与实现论文 职场大变样社区(www.zcdby.com):下载毕业设计成品 职场大变样社区(www.zcdby.com):下载毕业设计成品 全套资料,全部50元以下 基于Qt图片格式转换器的设计与实现 摘 要 随着计算机科学技术的飞速发展,图形化操作在人们生活中日益增加,人们对图形图像处理的需求也越来越大。利用QT跨平台的优良特性,以及它提供给开发者建立图形用户界面需要的特性,设计了一款可移植的图像格式转换器。该软件可以实现 、图片打印和图像格式转换等功能。 图片查看、图片缩...

基于qt的图像格式转换器设计与实现论文
基于qt的图像格式转换器设计与实现 论文 政研论文下载论文大学下载论文大学下载关于长拳的论文浙大论文封面下载 职场大变样社区(www.zcdby.com):下载毕业设计成品 职场大变样社区(www.zcdby.com):下载毕业设计成品 全套资料,全部50元以下 基于Qt图片格式转换器的设计与实现 摘 要 随着计算机科学技术的飞速发展,图形化操作在人们生活中日益增加,人们对图形图像处理的需求也越来越大。利用QT跨平台的优良特性,以及它提供给开发者建立图形用户界面需要的特性,设计了一款可移植的图像格式转换器。该软件可以实现 、图片打印和图像格式转换等功能。 图片查看、图片缩小、放大 本设计是在windows 7和Linux Ubuntu16.04下使用QT技术进行的GUI设计,以C++为基础开发语言,利用QT Creator 5.5.1 IDE的图形界面快速开发功能实现一个图形用户界面,并且通过调用QT中自带的C++类库完成图像格式转换器的设计与实现。 该设计是调用系统的函数接口来编程的,具有体积小、占用资源少、运行速度快等特性,还可以通过QT跨平台的特性,实现代码复用、快捷移植等。通过利用Qt Creator5.1.1开发工具对图像格式转换器的开发,了解了利用QT开发软件的流程和Qt自带的强大C++类库,为以后相关软件的开发和Qt的熟练使用奠定了坚实的基础。 关键词:跨平台;可移植;图像格式转化;代码复用 I 职场大变样社区(www.zcdby.com):下载毕业设计成品 Design and Implementation of Image Format Converter based on QT Abstract With the rapid development of computer science and technology, graphical operation is increasing day by day in people's life. By using the excellent characteristics of QT cross platform, and the characteristics that it provides to the developer to build a graphical user interface, a portable image format converter is designed. This software can realize the function of image viewing, image reduction, enlargement, image printing and image format conversion. This design is the GUI design performed using QT in Windows 7 and Linux ubuntu16.04. In C + + is developed based on the language, graphical interface by QT creator 5.5.1 ide rapid development function to achieve a graphical user interface, a C + + class library and by calling the QT comes with complete image format converter design and Implementation. The design is called the function of the system interface to programming, with a small size, less resources, fast running and other characteristics, but also through the characteristics of QT cross platform, code reuse, fast transplant, etc.. By using QT Creator5.1.1 development tools develop the image format converter, to understand the powerful c + + class library using the built-in QT software development processes and QT, laid a solid foundation for the future development and QT software skilled in the use of. Key words: Cross platform; portable; image format conversion; code reuse II 职场大变样社区(www.zcdby.com):下载毕业设计成品 目 录 1 绪 论 ...........................................................1 1.1 课 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 背景 ...................................................1 1.2 课题研究目的和意义 .........................................1 1.3 论文研究主要内容 ...........................................2 1.4 小结 .......................................................3 2 Qt软件介绍及开发 ................................................4 2.1 Qt介绍及其发展 .............................................4 2.2 Qt的特点和组成 ............................................11 2.3 Qt的开发机制介绍 ..........................................15 2.4 小结 ......................................................18 3 图像格式转换器的设计与实现 ......................................19 3.1 架构分析与设计 ............................................19 3.1.1需求分析设计 .........................................19 3.1.2 界面设计分析 .........................................20 3.1.3 软件框架设计 .........................................23 3.2 程序的实现 ................................................29 3.3 小结 ......................................................32 4 软件功能测试 ....................................................33 4.1 测试的任务及目标 ..........................................33 4.1.1 测试的任务 ...........................................33 4.1.2 测试的目标 ...........................................33 4.1.3测试的原则 ...........................................33 4.2 Qt下软件测试 ..............................................34 职场大变样社区(www.zcdby.com):下载毕业设计成品 4.2 双平台测试 ................................................35 4.2.1 Win7下测试 ..........................................35 4.2.2 Linux Ubuntu 16.04下测试 ...........................37 4.3 小结 ......................................................39 5 结论 ............................................................40 参考文献 ..........................................................41 致 谢 ............................................................42 附录:英文技术资料翻译 ..........................................43 职场大变样社区(www.zcdby.com):下载毕业设计成品 1 绪 论 随着计算机科学技术的不断发展,用户与计算机的交互变得越来越频繁。图形用户界面的出现给了非计算机专业用户一个非常大的惊喜,非计算机专业的用户可以经过简单的培训掌握计算机使用的技能,所以这种新型交互方式它简单易学的优点获得了广大用户的喜爱,图形化操作也已经成为未来发展的方向。本系统本着帮助用户更加快速便捷图像格式处理的目的,设计并实现了图像格式转换器。 1.1 课题背景 本系统的设计背景是源于图像格式转换软件虽然多种多样,但是鱼龙混杂,转换速度慢,转换效果也不尽如人意,质量得不到保障。另一方面,大多数的软件只能在一种平台上运行,不能做到跨平台,如果需要再另一个平台实现相同的功能的时候还需要重新下载不同的版本,这样是用户的操作复杂性增加很多。 对于这种情况,想到了要用可以跨平台的Qt技术来实现图像格式转换器,这样既可以保证高效率的实现图像格式转换,又可以快速方便得移植到Windows、Linux、Android等平台上,实现代码复用,使用起来简单方便,是一个非常有意义的研究,基于这样的目的,开发了基于Qt的图像格式转换器,不仅减少了成本,控制了效率,也提高了工作的质量。 1.2 课题研究目的和意义 在科学信息技术高速发展的今天,图像图形处理的技术越来越成熟,人们对于图形图像处理技术的依赖程度也在逐渐增加。 对于图像处理方面的定位,在信息科技发展的进程中,也发生了巨大的变化。以前的图像,有可能是物的附属,也有可能是价值的附属,这些都无法按照意指的规则进行排列组合以及格式转化。 目前在GUI开发时也会有很多种的选择,但是目前很少有IDE可以在几乎完全不修改代码的条件下在多个操作系统下编译。而如果不能实现代码复用,要想在另一个 1 职场大变样社区(www.zcdby.com):下载毕业设计成品 系统上想要实现同样功能,就只能舍弃原来的开发代码,并进行重新开发。这种开发机制是非常不理想的,会浪费大量的人力、物力和财力,而且也会造成原来已经开发了达到很成熟效果的成果被丢弃。利用Qt进行开发软件就很巧妙得解决了这个问题,Qt的可跨平台性决定了我们只需要在不同平台下安装好Qt,并且把在任意一个平台上编写好的代码进行编译一次,就能在不同的平台上运行,这种开发模式大大提高了开发软件的效率,同时也方便了后期程序员对软件的维护工作。这样的特性使得Qt可以玲离尽致的将不同平台的优势发挥出来,而你想要做到这一点只需要在实现文件种将系统的头文件include进来。Qt中还有非常多的API和 C++ 类,还提供基于模板的 file、collections、 I/O device、directory management、serialization、date/time 类。甚至还具有正则表达式的处理功能。 程序员在开发软件、制作网页、注册用户时,根据不同的情景,需要不同格式的图片进行上传,以达到不同的效果,所以一张图片在不同的情景之下一种图片格式不可能满足用户的需求。这时就有一款图像转化软件能够满足市场以及开发人员双方的需要。而在嵌入式发展飞速的今天,则更需要有一款这样的软件可以随时随地对图像进行处理。尤其是在Linux环境下,图形化软件就特别少,这就需要一个可以方便使用及操作的有图形界面的软件。Qt能够在多种平台下实现“一次编译,多次运行”,这是市场发展的好趋势。 1.3 论文研究主要内容 图像格式转换器是一个以帮助用户进行图像处理为目的,借助可跨平台的Qt Creator及其丰富的c++类库实现的应用系统。所以定位必须要准确,什么样的目的就要体现什么样的特色。 本系统能够让人们更加方便的在不同的平台上进行图像处理和图像格式转换,从而更快捷的帮助人们获取到所需要的图像处理效果,同时人们可以在不同平台上使用相同软件,可以轻松快捷达到目的。 本系统分为两部分,分别是图片浏览和图像图形格式转换,图像格式包括源文件路径、目的文件路径、转换格式选择以及转换按钮这几部分组成,图片查看部分主要是由图片打开、图片放大和缩小等功能组成,本系统可以在不同的平台上实现,例如 2 职场大变样社区(www.zcdby.com):下载毕业设计成品 Windows、Linux、Android等,只要安装了Qt Creater IDE,就可以很好的实现代码复用,在不同的平台上进行开发使用。 通过这些模块的介绍以及结合图片的介绍,对整个系统有了更加深刻的了解,本论文也将通过需求分析、系统设计与实现的顺序对图像格式转换器进行详细具体的介绍,结合图片展示从而更加清晰的展现整个系统的构成。 1.4 小结 本章通过介绍项目的背景、项目研究的目的和意义以及项目研究的主要内容,表明了开发图像格式转换器的价值。在现如今社会中,信息化的步伐加快,需要使用计算机的领域越累越多,未来计算机用户的数量也会呈现指数式的增多。大量用户的增长,带来的是更大的机遇和挑战。大部分的用户没有经过专业的计算机技术的培训,开发简单易学的更为图形化的应用已经成为未来开发软件的趋势。人们对于图形图像处理的需求也越来越大,本次开发的图像格式转换器帮助用户解决一部分的图像图形处理问题,可以在Windows和Linux平台上方便使用一套代码就可以进行图像图形处理,大大得提高了用户使用的体验效果。 3 职场大变样社区(www.zcdby.com):下载毕业设计成品 2 Qt软件介绍及开发 在项目的开发过程中,选择合理的技术是非常重要的一个步骤,经过系统得分析和比较之后得出一个结论,这个结论说明了开发的这个软件使用这种技术可以实现最好的设计要求。本章介绍Qt的历史和发展及其特点和开发机制,从而帮助理解选择Qt技术开发项目的正确性和必要性。 2.1 Qt介绍及其发展 Qt是诺基亚公司旗下的一个跨平台的C++图形用户界面应用程序框架。Qt基于C++语言,是面向对象的,非常容易扩展,而且允许真正地进行组件编程。Qt从1996年开始进入商业领域,已经在全世界范围内成为了成功的应用程序开发框架。基本上,Qt同XWINDOW上的Motif,OPENWIN,GTK等图形界面库和Windows平台上的VCL、OWL、MFC是同类型的东西,Qt具有丰富的应用程序接口,还有250多个的 C++ 类,还提供基于模板的 file、collections、 I/O device、directory management、serialization、date/time 类。甚至还具有正则表达式的处理功能。 Haavard Nord和Eirik Chambe-Eng于1991年开始开发“Qt”,1994年3月4日创立公司,最早名为Quasar Technologies,然后更名为Troll Tech,然后再改为Trolltech,中文名是“奇趣科技”,2008年6月17日被NOKIA公司收购,更名为Qt Software。 Qt Software在2009.5.11宣布Qt实行开源管理机制,开发人员可以分享他们自己编写的代码和例子来帮助Qt的发展。Qt Software运用了基于Git的Web源代码管理系统来管理这些内容。 Qt Software在推出开放式Qt代码库的同时在其网站发布了它的产品规划。产品规划中概述了该研发项目中的最新功能和了Qt未来发展的方向,鼓励程序员贡献代码,鼓励用户提供反馈,协助引道和塑造Qt未来的发展。Digia在2012年8月9日宣布全面收购诺基亚Qt业务及软件技术,并 计划 项目进度计划表范例计划下载计划下载计划下载课程教学计划下载 将Qt应用到iOS、Android以及Windows 8平台上。Haavard Nord和Eirik Chambe-Eng于1991年开始开发“Qt”,1994年3月4日创立公司,最早名为Quasar Technologies,然后更名为Troll Tech,然后再改为 4 职场大变样社区(www.zcdby.com):下载毕业设计成品 Trolltech,中文名是“奇趣科技”,2008年6月17日被NOKIA公司收购,更名为Qt Software。 用Qt开发出来的软件,只需要用再任意一个平台上编写的一套代码就可以在其他可以运行Qt IDE 的平台上编译和运行,输出结果会跟据不同的平台显示平台与别的平台不同的图形用户界面风格。 Linux/X11:用于X Window System(如Solaris、AIX、HP-UX、Linux、BSD)。支持KDevelop和Eclipse IDE集成。 Mac:用于Apple Mac OS X。基于Cocoa框架。支持Universal Binary。支持以Xcode编辑、编译和测试。 Windows:用于Microsoft Windows。支持Visual Studio集成,也可以使用MinGW编译 Embedded Linux:用于嵌入式Linux。可以通过编译移除不常使用的组件与功能。通过自己的视窗系统QWS,不需依赖X Window System,直接写入Linux帧缓冲。可以减少内存消耗。并提供虚拟帧缓冲QVFb,方便在桌面系统上进行嵌入式测试。 Windows CE / Mobile :用于Windows CE Symbian:用于Symbian platform Maemo/MeeGo:用于Maemo Wayland –用于Wayland显示服务器,Qt应用程序可以在运行时切换图形后端,如X与Wayland。 Qt Creator的功能包含了Project Guide、File View以及类的工具、集成了 Qt Designer、Qt Linguist、Qt Assistant、集成 QMAKE 构建工具和图形化的 GDB 调试前端等。 尤其是我们开发软件和制作网页的时候,就需要很多不一样格式的图片装饰,不可能使用一种格式的图片就满足用户所有需求。这时就有一款图像转化软件能够满足市场以及开发人员双方的需要。而在嵌入式发展飞速的今天,则更需要有一款这样的软件可以随时随地对图像进行处理。尤其是在Linux环境下,图形化软件就特别少,这就需要一个可以方便使用及操作的有图形界面的软件。由于上诉原因,本次我们要开发一个图像格式转化器。 5 职场大变样社区(www.zcdby.com):下载毕业设计成品 Qt 包括了一套集成的开发工具,可以加快在 X11 平台上的开发。由于Qt 是 KDE 桌面环境的基础,所以在各个 Linux 社区都是人尽皆知的。Linux中KDE是尽人皆知的,KDE中基本上所有的应用程序都是使用进行Qt编写的。 经过了半个世纪的改进和完善,Qt技术已经基本成熟,不仅仅具有了丰富的C++类库,并且较新的IDE中增加了各种库,包括DataBase库、Multimedia库、OpenGL库、XML库、Script库等,很大程度上丰富了使用Qt开发复杂的大规模的跨平台应用程序的能力,它的核心库也增加了进程间通信、多线程等模块,真正意义上实现了其研发宗旨“Code Less; Create More; Deploy Anywhere.”。 下列模块提供一般的软件开发 QtCore—QtCore模块是所有基于Qt的应用程序的基础,提供信号与槽的对象间通讯机制、IO、事件和对象处理、多线程 QtGui—包含了开发图形用户界面应用程序所需的功能。使用其支持的各个平台的原生图形API。支持反锯齿、矢量形变。支持ARGB顶层widget QtMultimedia—提供了用于多媒体内容处理的QML类型集和C++类集。同时提供访问摄像头及音频功能的API。包含的Qt音频引擎支持三维音频回放及管理。 QtNetwork—提供了网络程序设计功能。支持通用协议,如HTTP、FTP和DNS,包括对异步HTTP 1.1的支持。与较低层的TCP/IP和UDP协议,如QTcpSocket、QTcpServer和QUdpSocket QtOpenGL—提供在应用程序中使用OpenGL和OpenGL ES加入3D图形。在Windows平台上亦支持Direct3D QtOpenVG-提供OpenVG绘图支持的一个插件 QtScript—包含完全集成的ECMA 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 脚本引擎。提供信号与槽机制简化对象间通讯和QtScript调试器。 QtScriptTools—额外的Qt Script组件 QtSql—将数据库集成至应用程序。支持所有主要的数据库驱动包括ODBC、MySQL、PSQL、SQLite、ibase、Oracle、Sybase、DB2。 QtSvg—支持SVG格式 QtWebKit—集成WebKit,提供了HTML浏览器引擎,便于在原生应用程序中嵌入 6 职场大变样社区(www.zcdby.com):下载毕业设计成品 网络内容和服务。 QtXml—提供了XML文档的阅读器和编写器、支持SAX和DOM。 QtXmlPatternsl—提供了XQuery和XPath引擎支持。 Phonon—集成Phonon,支持跨平台应用程序播放音频和视频内容。Qt5开始不支持Phonon。 Qt3Support—模块提供兼容Qt 3.х.х版本的程序库 QtDeclarative [34] - engine for declaratively building fluid user interfaces in QML 作业于Qt附带工具的模块 QtDesigner—提供扩充Qt Designer的类。 QtUiTools QtHelp—协助集成在线文件到应用程序中。 QtTest—提供单元测试框架和鼠标和键盘类比功能。集成Visual Studio和KDevelop。 下列模块用于Unix开发 QtDBus 下列模块用于Windows开发 QAxContainer QAxServer 图形用户界面 Qt的图形用户界面的基础是QWidget。Qt中全部类型的GUI组件例如QPushbutton、QLabel、QToolbar等都派生自QWidget,而QWidget又继承自QObject。Widget负责接收来自键盘、鼠标以及窗口系统的其他的事件,并且描绘了自己,将自身显示在屏幕上。每一个的GUI组件都是一个widget,widget不仅可以自己显示,还可以作为一个容器将其他的Widget包含进来而且一起显示。 QWidget是一个实体类,QWidget显示能力包含了透明化及Double-Buffering,而且QWidget可以被包含在一个已经创建好的User Windows中;如果一个Widget没有说明谁是它的父Widget,输出程序执行结果时就会出现一个单独的窗口或者是一个最上层的Widget。Qt还提供了一种托管机制,当一个Widget在建立的时候指定了它的父 7 职场大变样社区(www.zcdby.com):下载毕业设计成品 Widget,这时它的生命周期就会交给它的父Widget来进行管理,当它的父Widget被执行完毕进行释放时候,自身也会被释放了,以确保Widget在已经不会使用时会被删除。 信号与槽 Qt利用信号与槽机制(signals/slots)来替换传统的callback来进行对象之间的通信。以往的callback缺乏安全性,在调用函数的时候,没有办法确定传递的是正确形态的参数还是错误的。在与对象相关的event被触发的时候,对象立即会发出一个signal;slot就是要接收这个signal而且进行执行slot已经定义好的相关的行动的特定的函数。信号和接收信号的槽之间进行交互的数据的数据的type必须要一致,若是不一致的话,IDE中的编译错误下就会出现提示,这也就说明不成功不能进行下一步操作。Signal和Slot可以接收任何形态、数量的形参和实参,所以说这种机制是安全的。这种机制可以保证在连接信号和槽的时候,槽可以接受到正确的信号参数类型并且正确运行。 信号与槽机制保证了低耦合性,发送信号的类并不知道是哪个Slot会接收到这个信号,换句话说就是任何一个signal都可以调用所有的slot。信号可以在程序运行的任意时刻任意地点进行发射,甚至在slot里再发射另外一个。信号与槽之间是用QObject的static方法connect来进行交互的。信号与槽之间的连接不仅仅可以定为一个信号连接一个槽,而且一个信号可以连接到多个槽,或者是多个信号可以连接到一个槽,信号也可连接到信号。 布局管理 布局管理类用来说明一个应用程序中的用户界面的Widget如何放置。当窗口缩小或者放大的时候,布局管理器会自行调整窗口的大小和位置,甚至是窗口中出现字体的大小都可以进行调整,保证它们的图形用户界面依然看起来相对整洁和美观。 Qt自带的布局管理类型有:QHBoxLayout、QVBoxLayout、QGridLayout和QFormLayout。这些类继承自QLayout,但QLayout非继承自QWidget而是直接源于QObject。他们负责widget的几何管理。如果想要创建更为复杂的界面设置,可以继承QLayout。 QHBoxLayout:配置widget成横向一列 QVBoxLayout:配置widget成垂直一行 8 职场大变样社区(www.zcdby.com):下载毕业设计成品 QGridLayout:配置widget在平面网格 QFormLayout:配置widget用于2栏标签- field Main Window Qt提供了下列主视窗管理和相关的用户界面组件的类的: QMainWindow:提供一个标准的应用程序主视窗。当中可以包括菜单、工具栏、状态栏、停驻组件等组件。 QDockWidget:提供了一个可用于创建弹簧工具调色板或辅助窗口的widget。Dock widgets可以移、关闭、浮动为外部视窗。 QToolBar:提供了一个通用的工具栏widget,可以放入一些不同的action有关的工具,如按钮、下拉菜单、comboboxes和spin boxes。 Graphics View Graphics View提供了用于管理和交互大量定制的2D图形对象的平面以及可视化显示对象的视图widget,并支持缩放和旋转功能。 整个Graphics View框架提供一个以Item为基础的model-view设计。由3个主要的类的组成,分别是QGrphicsItem、QGraphicsScene和QGraphicsView。若干个View可以显示一个在Scene中,而每个Scene中都包括不同形状的Item。 该框架包括一个事件传播的架构,让在Scene上的Item有双精度的交互能力。Item可以处理键盘事件,鼠标按下、移动、释放和双击事件,他们也可以跟踪鼠标移动。 Graphics Vie则使用BSP(二进制空间划分)树可以快速地找到指定的Item,因此即使是包扩了成千上万个Item的大型Scene,也能实现实时的图形化显示。 KDE中的Plasma亦是基于Graphics View实现的。 无障碍环境 无障碍环境必须要有可以无障碍兼容的应用程序和辅助应用程序技术以及辅助应用程序工具之间的相互合作。应用程序通常不会与辅助工具直接进行通信,而是通过应用程序的辅助技术帮助,这是应用程序和辅助应用程序工具之间进行信息交换的桥梁。用户界面上的元素以及与它们相关的消息,例如:Pushbutton和scroll bar,都是使用应用程序的辅助技术来显示的。Qt支持Windows上的Microsoft Active Accessibility (MSAA)和Mac OS X上Mac OS X Accessibility。 9 职场大变样社区(www.zcdby.com):下载毕业设计成品 AT-Servers是可以无障碍兼容的应用程序,而AT-Clients则是应用程序的辅助工具。使用Qt开发的应用程序一般是AT-Server,但是比较特殊的应用程序也可以用AT-Client的方式来工作。 国际化 Qt中自带的字体引擎可以在同时显示出好多种不同的字体系别。而且Qt内部存储文字用的是Unicode编码。 Qt还可以支持多国语言,可以全部使用英文来撰写用程序中的文字,而且可以将整个应用程序中的文字改成另一种的语言文字甚至是在完全不修改程序的状况下,而可以帮助处理不一样的语言中的单数和复数问题。 Qt中的翻译文件因为是独立的,所以增加支持的语言是相当容易的,而且翻译文件是XML格式,可以在软件中直接进行编辑或者使用Qt Liguist也可以翻译,可以方便没有程序开发能力的翻译人顺利完成翻译。Qt自身附带的工具程序可以自动的检测到需要翻译的文字并且自动产生翻译文件。 多线程 Qt提供与平台无关的线程类的支持,并且使用了信号与槽通信机制,使得线程之间的交互式完全类型安全的。这样的线程支持使它善于开发具有可移植特性的多线程Qt应用程序。并且可以充分地利用Qt的多核架构,获得最好的运行效果。还可以自动调整系统使用的线程数根据可以使用的处理器内核数。 语言绑定 Qt中除了C++之外,还有很多种其它计算机语言的应用程序接口,可以使用这些应用程序接口进行Qt应用程序的开发。 Qt 4.6开始支持Symbian平台,并且支持的平台中增加了很多,包括Windows 7、Apple Mac OS 10.6 等,还为VxWorks和QNX系统提供网络社区服务。Qt 增加对 X86、X11 、Symbian 和ARM 的支持,所以开发人员可以在好几个Qt支持的平台上进行软件开发。Qt跨平台的特性,使得使用Qt开发的应用程序更好的得到推广使用,可以更加快速得进入应用市场,而且可以在更多设备上使用,使用的人群也会增加很多。Qt Mobility项目下全新Qt API技术预览版也同时发布。开发人员可以利用这些跨平台的API开发更多的功能,例如联系人及网络连接、管理信息发送和接收以及导航类设备 10 职场大变样社区(www.zcdby.com):下载毕业设计成品 的定位功能等。性能的改进主要是以下几点: Qt GraphicsView 、OpenVG 、OpenGL 、WebKit、DirectFB 等方面。 2013年7月3日,经过了 6 个月的改进Qt5.0的开发和测试之后,发布了新版本—Qt 5.1 正式版。新版本主要是修复了 Qt5.0 中的 bug,除此之外,新版本还增加了很多新特性和一些小的优化和改进。 Qt 5.1 还绑定了 Qt Creator 2.7.2,是通过在线的安装器来进行安装的,而且可以自动更新,还提供了一个 Visual Studio 插件。 最新的Qt可以支持MS/Windows - 95、98、NT4.0、ME、2000、XP 、Vista、Win7、win8、win2008、Unix/X11 - Linux、SunSolaris、HP-UX、CompaQtru64 UNIX、IBMAIX、SGI IRIX、FreeBSD、BSD/OS等其它许多的X11平台,而且也添加了非常多的功能。目前软件市场上的Google地球和office WPS等一些大家非常熟悉的软件,都是用Qt来编写开发的。使用Qt可以在开发上降低很大一部分的成本,而且也非常容易上手,有着很广阔的市场发展前景。 2.2 Qt的特点和组成 Qt是提供了大量的容器类而组成的一个强大的跨平台开发架构,可以在多种平台上不修改代码运行,具有与平台无关的特点。Qt中有一个强大的核心类库,它是Qt的核心,Qt中所有应用程序中用到的类都是核心类QtCore继承而来。 Qt中常用的一些类和方法 QChar 表示的是一个字符的类,在核心QtCore之中。设计应用程序中很多常用到的方法,比如: QChar(); // 构造一个空字符,即'\0' QChar(char ch); // 由字符数据ch构造 QChar(uchar ch); // 由无符号字符数据ch构造 QChar(ushort code); // 由无符号短整形数据code构造,code是Unicode编码 QChar(short code); //由 短整形数据code构造,code是Unicode编码 11 职场大变样社区(www.zcdby.com):下载毕业设计成品 QChar(uint code); // 由无符号整型数据code构造,code是Unicode编码 QChar(int code); // 由整型数据code构造,code是Unicode编码 在实际使用时,很少直接的构造 QChar 类的对象,而是将这些构造函数当做类型转换来使用,让编译器自动构造所需要的QChar类对象。 QChar 类提供了很多成员函数,可以对字符的类型进行判断,如: bool isDigit() const; // 判断是否是十进制数字('0' - '9') bool isLetter() const; // 判断是否是字母 bool isNumber() const; // 判断是否是数字,包括正负号、小数点等 bool isLetterOrNumber(); // 判断是否是字母或数字 bool isLower() const; // 判断是否是小写字母 bool isUpper() const; // 判断是否是大写字母 QString 类提供了很多函数用于将字符串转换为数值,例如: QString &setNum(int n, int base = 10); // 整型数 QString &setNum(uint n, int base = 10); // 无符号整型数 QString &setNum(long n, int base = 10); // 长整型 QString &setNum(ulong n, int base = 10); // 无符号长整型数 QString &setNum(short n, int base = 10); // 短整型数 QString &setNum(ushort n, int base = 10); // 无符号短整型数 QString &setNum(double n, char format = 'g', int precision = 6); // 高精度浮点数 QString &setNum(float n, char format = 'g', int precision = 6); // 浮点数 将浮点数转换为字符串的时候,format —转化格式,precision —转换结果的精度就是有效数组的个数。 QPoint 代表一个坐标点,从属于QtCore库,可以认为是一个整型的横坐标和一个整型的纵坐标的组合,常用到的方法有,构造宽度为width,高度为height的QSize对象。 QPoint 类支持以下两种构造方式: 12 职场大变样社区(www.zcdby.com):下载毕业设计成品 QPoint(); // 构造横纵坐标均为 0 的 QPoint 对象 QPoint(int x, int y); // 构造横纵坐标分别为 x 和 y 的 QPont 对象 通过以下成员函数可得到 QPoint 对象中的横纵坐标的引用: int &rx(); // 得到横坐标的引用 int &ry(); // 得到纵坐标的引用 int &rx(); // 得到横坐标的引用 int &ry(); // 得到纵坐标的引用 注意这些引用都不是只读的,也就是说可以通过它们直接修改 QPoint。 QSize(int width, int height); QFont 代表字体,在QtGui库中实现,可以利用其中方法设置字体属性。 QPixmap 代表图像, 也在QtGui库中实现。此函数可以设置图像参数,加载和保 存图像。 QPixmap();//构造大小为0的空图像 QPixmap(const QSize &size);//构造大小为size的图像,图像数据未初始化 QPixmap(int width, int height);//等价于QPixmap(QSize(width, height)); QPixmap(const QString &fileName, const char *format = 0, Qt::ImageConversionFlags flags = Qt::AutoColor);//加载指定的文件中的图像并 生成QPixmap对象。fileName参数是文件名, format参数是指定图像文件的格式,如 果参数值为0,将自动识别,flags参数是表示颜色转换模式 图像参数: int depth() const;//颜色深度,即每像素(px)所占的byte(比特)数 int height() const;//图像高度,单机是像素 int width() const;//图像宽度,单位是像素 QSize size() const;//图像的大小,即QSize(width(), height()); QRect rect() const;//图像的矩形区域,即QRect(QPoint(0,0), size()); 加载和保存图像: bool load(const QString &fileName, const char *format = 0, 13 职场大变样社区(www.zcdby.com):下载毕业设计成品 Qt:ImageConversionFlags flags = Qt::AutoColor); //从指定的文件中加载图像,返回true表示加载成功,返回false则表示加载失败 bool save(const QString &fileName, const char *format = 0, int quality = -1) const; //将图像保存到文件, fileName参数是文件名. Format参数是字符串,表示图像文件的格式,如果参数为0,则自动确定. quality:表示图像保存的质量,取值范围为0~100,-1表示采用默认值,质量越低压缩率越大,越不清晰 QIcon 代表图标, 在实现QtGui库中,是一系列图像的组合,每个图像代表窗口在某种状态下应该显示的图标。可以构造和添加图像 构造: QIcon();//构造一个空图像构成的图标 QIcon(const QPixmap &pixmap);//从Qpixmap对象中构造图标,窗口不同状态下系统会自动加载对应的图像 QIcon(const QString &fileName);//从图像文件中构造图标,文件不是立刻加载,而是图标要显示时才加载 添加图像: void addFile(const &fileName, const QSize &size = QSize(), Mode mode = Normal, State state = Off); //fileName参数是文件名 size参数是指定大小 mode参数是指定使用模式,即窗口在何种状态下都使用这个图像 state参数是指定使用状态 //Mode为QIcon类的成员类型,取值如下: QIcon::Normal:窗口为使能状态,但未激活 QIcon::Disabled:窗口为禁用状态 QIcon::Active:窗口为激活状态 QIcon::Selected:窗口被选中 QIcon::Off:窗口是关闭状态 QIcon::On:窗口是打开开状态 QWidget 代表Qt中使用的一般窗口,也是在实现QtGui库中实现,包括各种各样的窗口,可以设置其可见性、隐蔽性、窗口特征等。 QDialog 是Qt中的对话框,用来实现那些只是暂时存在的图形用户界面。对话框 14 职场大变样社区(www.zcdby.com):下载毕业设计成品 的形式——非模态和模态,非模态对话框的使用方法和行为都和普通的Window很像;模态与非模式对话框的不同之处在于:模态对话框在显示的时候,其他的窗口全部都变成非激活的状态,换句话说,就是不能接受鼠标和键盘事件。模态对话框显示的形式分成对整个应用程序的模态和对窗口的模态:如果对话框的出现会导致项目中的其他所有的Window都没有响应,这样的形式就是对整个应用程序的模态;如果对话框的出现只导致了它所在的Window没有响应的话,这样的形式称为对窗口模态。 另外还有QLabel、QPushButton、QCheckBox、QComboBox、QRadioButton等一些界面显示类,这里不再做赘述。 2.3 Qt的开发机制介绍 信号与槽——是Qt开发的核心机制。Signal与Slot机制,是Qt自己设置的一种通信机制,是与C++语言没有关系的。要想合理得利用信号与槽机制,必须借助MOC(Metia Object Compiler)工具对C++程序进行预处理,同时处理高层次的事件而且自动生成所需要的附加代码。信号与槽实际上就是的接口,通常用于对象与对象之间的通信,是Qt最常用到的功能,是Qt开发软件关键不同于其他开发工具。 在编写图形用户界面中,我们通常是将一个widget的的一个变化信号被通知给另一个widget。例如:若系统正在解析一个XML文件,遇到一个新标签的时候可以通知列表视图用XML文件的结构来显示正在解析的文件。 时间比较久远的工具为了完成相同的目标的时候,则是使用被叫做“回调”的通信方法。“回调”其实就是一个函数的指针,你可以把一个函数(即回调函数)的指针传递给处理函数来让它通知你一些事件,处理函数则会自动得在合理的时候调用回调函数。“回调”也有不足之处,第一它不是类型安全的,系统不能判定处理函数是不是使用了对的参数调用回调函数。再次处理函数必须在调用之前就知道要调用哪个回调函数,回调函数和处理函数是非常紧密地联系在一起的。 Qt技术中我们使用一种机制用来代替“回调”,这种机制就是信号和槽。Qt的widget中已经有非常多已经定义好的signal,当触发一个事件的时候,那么相应的对象就会发射一个signal,我们还可以通过继承来加入我们自己的signal。当对象的内 15 职场大变样社区(www.zcdby.com):下载毕业设计成品 部状态发生改变的时候,系统就发射信号,只有定义了一个信号的类和继承这个类的子类才能发射这个信号。信号是由moc工具自动生成的,而且不是在.cpp文件中实现的,也不能有任何的返回类型(void类型也不可以)。当发射一个信号时,接收这个信号的槽会立即开始执行,就像一个普通成员函数被调用是一样的。 所谓的槽(Slot),实际上就是普通的C++成员函数,而且可以和普通的成员函数一样被调用,这个函数是用来接收信号的,这也是区别于普通函数的关键一点,同时这个函数也能被调用来处理特定信号。Qt的窗口部件同时也有很多预定义的槽,但你可以加入自己想定义的槽,这样就可以根据自己的需要处理想要处理的信号。当系统发射一个信号的时候,与这个信号连接的槽被调用。槽的参数是不能有默认值的,为了槽的参数而使用自己定义的类型是不可取的,这一点是和信号一样的。槽可以和普通成员函数一样,可以有访问权限。一个槽的访问权限决定了谁可以和它相连:一个public slots:区包含了任何信号都可以相连的槽。这种机制对于组件编程来说是很有用的:假如你已经生成了许多的对象,它们互相之间并不知道对方的存在,把它们的信号和槽连接起来之后信息就可以正确地传递,并且正确的执行。一个protected slots;区包含了之后这个类以及继承了它的子类的信号才能连接到槽,换句话说槽只是类的一部分,并不是它与外界的接口。一个private slots:区包含了与这个类相关的信号可以连接的槽,也就是说它与这个类的联系是非常紧密的,甚至是继承它的子类都没有在连接权限上获得这样的信任。 槽也可以定义为虚的,实践中这种功能也是非常实用的。 信号和槽的机制是类型安全的:一个信号的签名必须与接收这个信号的槽的签名相匹配。(实际上槽可以忽略额外的签名,所以一个槽的签名可以比它接收到的信号的签名少。)编译器就可以根据它们的签名是否是一致的来帮助我们检测类型是否匹配。信号和槽是宽松地联系在一起的:发射信号的类可以知道也不用知道具体的哪个槽会接收到这个信号。Qt的信号和槽的机制可以保证若你将一个信号和一个槽连接起来,槽会在正确的时间使用信号的参数而被调用。信号和槽可以使用任何数量、任何类型的参数。它们是完全类型安全的:不会再有回调核心转储(core dump)。信号和槽机制不会依赖于任何一种图形用户界面的事件路径,当所有的槽都返回后emit也将返回。 16 职场大变样社区(www.zcdby.com):下载毕业设计成品 如果几个槽都连接到一个信号的时候,系统发射信号发射的时候,这些槽也就会被调用,这些槽会被按照任意顺序开始执行。Qt的信号和槽机制可以实现多个信号与单个槽连接,单个信号与多个槽连接,甚至将一个信号与另外一个信号相互连接。系统无论什么时候发射一个信号都可以立刻发射第二个信号。信号与槽机制构成了一个强大的Qt连锁编程机制。 从QObject类或是它的子类,如QWidget等继承的所有类都可以包含信号和槽。 当对象改变它们自己的状态的时候,同时信号被发送,所有的对象在通信时候都要做到这一点。它不需要知道有没有槽接收它所发射的信号,这就做到了真正的信息封装,而且可以确保对象可以用作一个软件组件。任何一个槽都并不知道是否有任何信号会与自己相连接。而且,所涉及的对象并不了解具体的通信机制。关于参数需要注意。如果信号和槽使用的是比较特殊的类型,信号和槽则都是可以多次使用的。如果QScrollBar::valueChanged() 使用了一个特殊的类型,比如hypothetical QRangeControl::Range,则它就只能被连接到被设计成可以处理QRangeControl的槽。 下图可以清晰的展现出信号和槽机制,如图2.1所示: 图2-1 Qt信号和槽机制关联图 Qmake工具介绍 Qmake是Qt Creator自带的工具,实际上是帮助Qt实现跨平台项目开发的辅助工 17 职场大变样社区(www.zcdby.com):下载毕业设计成品 具。Qmake工具能够自动生成Makefile、Microsoft Visual Studio 项目文件 和 xcode 项目文件。无论源代码是否使用Qt进行编写都可以使用qmake工具,所以qmake可以用于很多软件开发的构建过程。 编写及开发多平台的软件是单调乏味的,而且出现错误的几率很大,尤其是当不同的编译器和平台组合起来同时需要若干个编译文件的时候,而且维护起来更是艰难。但是Qt很好得解决了这个问题,通过附带的qmake工具可以快速构建出Cross Platform Bulids 跨平台应用程序。Qmake工具可以根据project中的.pro文件里面的内容生成当前平台所需要的 Makefile文件,当然在不同的平台下Makefile文件也是不相同的。当然开发者也能够自行撰写项目文件。Qmake工具包含很多其他的功能来方便 Qt 开发软件项目,例如自动的包含moc 和 uic 的编译规则。Qmake也支持跨平台开发以及shadow builds技术。Qmake工具还可以在不同的配置中切换。除此之外,它还可以进行调试及不同发布版本的生成,十分快捷方便。 2.4 小结 本章在技术方面通过介绍Qt技术及其特点和开发机制,说明了开发本系统的可行性,而在操作方面,也是利用了简单易于操作的可跨平台的IDE —Qt Creater,所以开发本系统是简单而快速的。经以上分析,说明该项目利用Qt技术开发上是非常合适的。 18 职场大变样社区(www.zcdby.com):下载毕业设计成品 3 图像格式转换器的设计与实现 本章对图像格式转换器的需求进行了综合的分析,说明了本项目的各个部分的具体实现,而且还附带了图解,以便更好得进行说明。展现了各个部分的内容以及它们之间的关系,配以图例,整个项目的架构和实现的具体方法便可以一目了然。 3.1 架构分析与设计 3.1.1需求分析设计 经常使用电脑应用软件的同学都应该知道,通过Windows系统自带图片浏览器查看图片的时候是比较方便、直接的。为了更加方便用户对图像图形的处理,本次开发了一款可跨平台的图像格式转换器,而且还带有图片浏览的功能。本次开发的图像格 Creator开发,其实现的功能在式转换器是在Windows7平台和Linux平台下利用Qt 基础的图片查看器的功能外增加图像格式转换功能。 嵌入式系统的Graphics User Interface是嵌入式系统实现人机交互的不可或缺的部分,也是构成嵌入式实时操作系统非常重要的窗口。 以下这些是系统对GUI的基本要求: 1.轻型、占用资源少 2.高性能 3.高可靠性 4.可配置 随着嵌入式系统的硬件设备的质量不断提高,而且价格不断降低,以及嵌入式系统应用范围的不断的扩大,嵌入式下的Graphics User Interface变得越来越重要,用户的持续增长使得对其需求也持续快速增长。 本次开发的软件就是为满足计算机用户对图像格式处理的的需要,而且可以大大方便同时在多平台下的开发者进行图像处理。 下面对软件的需求做一个简单的分析。 19 职场大变样社区(www.zcdby.com):下载毕业设计成品 该软件分成父窗口和子窗口两大部分,MainWindow部分是父窗口用来实现查看图片的功能,子窗口则是用了一个widget来实现的,用来实现图像格式转换的功能,子窗口设有图片源文件选择、输出路径选择、转换后输出文件的图片格式选择等。 (1)图片显示功能。用来浏览图片,可以实现图片放大、缩小等简单的图片查看功能。 (2)高级转化功能。这部分是本软件核心,启动此功能时,可以添加图片源文件、转换后的格式以及转换之后的需要保存文件的path等。而且在该程序中,是可以同时对图像格式进行批量转换的。 3.1.2 界面设计分析 该软件分为两个模块,如下图3.1所示: 图3-1 主界面设计图 1. 图片查看功能:点击文件->打开,可以选择要查看的图片,进行查看,还可进行放大缩小操作。还有相应的工具栏,以便用户快速使用这些功能。 20 职场大变样社区(www.zcdby.com):下载毕业设计成品 图3-2 图片查看设计图 “文件”下拉时设计显示效果(中间黑条为分隔符,下同) 图3-2-1 文件菜单下拉设计图 “查看”是对图片的展示效果的一个设置。这里的查看功能做的比较简单。其下 拉时设计显示效果如下图 图3-2-2 查看菜单下拉设计图 “编辑”是对本软件的核心功能高级转换,也就是图像格式转换的展示效果的设 21 职场大变样社区(www.zcdby.com):下载毕业设计成品 计。其下拉时显示效果如下图: 图3-2-3 查看菜单下拉设计图 “帮助”是传统的程序员开发项目的一种固定的习惯,帮助下应该有对该软件简单的说明和对版权的说明,是一个软件必不可少的部分。下拉时设计显示效果如下图: 图3-2-4关于菜单下拉设计图 2 . 图像格式转化功能:这部分是本软件核心,启动此功能时,可以添加图片源文件、转换后的格式以及转换之后的需要保存文件的path等。而且在该程序中,是可以同时对图像格式进行批量转换的。 22 职场大变样社区(www.zcdby.com):下载毕业设计成品 图3-3高级转化设计图 以上便是本次软件制作中所用到的主要界面。 3.1.3 软件框架设计 本次软件预设文件目录有: 头文件: imageconvert.h imageviewer.h 源文件: imageconvert.cpp imageviewer.cpp main.cpp 界面文件: imageconvert.ui 资源文件: icons.qrc 下面对各种文件进行说明: 项目中工程文件ImageConverter.pro 23 职场大变样社区(www.zcdby.com):下载毕业设计成品 QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = ImageConverter TEMPLATE = app SOURCES += main.cpp\ imageconvert.cpp \ imageviewer.cpp HEADERS += imageconvert.h \ imageviewer.h FORMS += imageconvert.ui QT += printsupport RESOURCES += \ icons.qrc 下面本软件实现的功能做简单介绍: imageconvert.cpp主要实现界面显示和图像格式转换功能,它继承了QWidget,可以用setWindowTitle(tr("ImageConverter"))方法来设置窗口的标题。srcPath主要实现源文件路径选择功能,这个方法主要是选择需要转换的图片。despath主要实现图像文件格式转换后要保存位置的路径选择,这个方法可以将转换后的图片保存到该路径对应的文件夹中。doselect主要实现对需要的图像格式的选择。startConvert函数实现对图像文件格式的转换,执行结束后获得目的格式的图像文件。 imageviewer.cpp主要实现图片查看功能,它继承了QMainWindow,期中ZoomIn用来实现图片放大功能,ZoomOut实现图片缩小功能。 imageconvert.ui则是QT为了方便界面开发,而设计的一个简单的界面设计程序,是一个XML文件: 24 职场大变样社区(www.zcdby.com):下载毕业设计成品 icons.qrc为资源文件,程序所需要的图标,图像,动画等都被存放在该文件中。 main.cpp 主要功能用来启动程序,构造类。 25 职场大变样社区(www.zcdby.com):下载毕业设计成品 本软件核心功能是进行图像格式转化,主要涉及的函数: 1. 进行初始化: ImageConvert::ImageConvert(QWidget *parent) : QWidget(parent) { setWindowIcon(QIcon(":/icons/Wizard.ico")); setupUi(this); filter = ".jpg"; jpgRadioButton->setChecked(true); setWindowTitle(tr("图像格式转换器1.0")); infoLabel->setText(tr("\tReady...")); initConnect(); } 2. 选择源文件路径 void ImageConvert::srcPath() { QString dirName; QString info; inFiles = QFileDialog::getOpenFileNames(this, tr("选择需要转换的文件"), //字符串列表 QDir::currentPath(), tr("*.bmp *.png *.jpg *.ico")); if (!inFiles.isEmpty()) { QDir dir(inFiles.at(0)); //链表 dirName = dir.path(); int i = dirName.lastIndexOf("/"); dirName.remove(i+1, dirName.length() - i -1); srcComboBox->insertItem(0, dirName); srcComboBox->setCurrentIndex(0); } info = tr("共有需要转换的文件 %1 个").arg(inFiles.size()); infoLabel->setText(info); 26 职场大变样社区(www.zcdby.com):下载毕业设计成品 infoLabel->update(); } 3. 选择转换之后保存文件路径 void ImageConvert::desPath() { QString tempPath; //定义输出路径的字符串 tempPath = srcComboBox->currentText(); //获取原文件地址组合框里边的字符串,赋值给输出路径字符串 if (tempPath.isEmpty()) //判断输出路径是否为空,如果为空返回真,执行IF里面的语句,如果不为空返回假,if里面的语句不执行 { outDir = QFileDialog::getExistingDirectory(this, tr("保存的文件夹"), QDir::currentPath()); //该函数打开一个文件对话框,返回路径,QDir::currentPath()获取应用程序路径,并初始化为对话框的当前目录。 } else { QDir dir(tempPath); outDir = QFileDialog::getExistingDirectory(this, tr("保存的文件夹"), dir.absolutePath()); //QDir::absoluteFilePath()函数返回当前目录下一个文件的绝对目录 } desComboBox->setEditText(outDir); //在组合框的文本设置文本编辑。 } 4.选择转换格式: void ImageConvert::doSelect() { QRadioButton *radioBtn = (QRadioButton *)sender(); if (radioBtn == bmpRadioButton) { filter = ".bmp"; bmpRadioButton->setChecked(true); 27 职场大变样社区(www.zcdby.com):下载毕业设计成品 } else if (radioBtn == jpegRadioButton) { filter = ".jpeg"; jpegRadioButton->setChecked(true); } else if (radioBtn == jpgRadioButton) { filter = ".jpg"; jpgRadioButton->setChecked(true); } else if (radioBtn == pngRadioButton) { filter = ".png"; pngRadioButton->setChecked(true); } } 5. 开始转换函数: void ImageConvert::startConvert() { QString newFilePath; int count = 0; infoLabel->setText(tr("loading...")); foreach (QString file, inFiles) { QString tempFileName; QPixmap newPicture; bool ok = false; QDir dir(file); int i; newPicture.load(file); tempFileName = dir.dirName(); i = tempFileName.lastIndexOf("."); tempFileName.remove(i, tempFileName.length() - i); newFilePath += outDir + "/" + tempFileName + filter; if (QFile::exists(newFilePath)) 28 职场大变样社区(www.zcdby.com):下载毕业设计成品 { QMessageBox box(QMessageBox::Warning, tr("警告"), tr("存在同名文件%1\n是否覆盖,").arg(newFilePath), QMessageBox::Yes | QMessageBox::No); if (box.exec() == QMessageBox::No){ continue;} } ok = newPicture.save(newFilePath); if (ok) { count++; } newFilePath.clear(); qApp->processEvents(); } infoLabel->setText(tr("\tReady...")); QMessageBox box(QMessageBox::Information, tr("Finish"), tr("共完成%1个文件的转换").arg(count)); box.exec(); } 3.2 程序的实现 图形用户界面是计算机与用户交互的重要方式。目前嵌入式Linux下的主流GUI系统有Microwindows、MiniGUI、Qt/Embedded等。嵌入式系统是现如今信息领域中最热门、最有前景的操作系统开发环境之一。给嵌入式系统设计一个高质量的图形用户界面非常必要,这将使计算机和用户之间的交互变得更加快速、更加便捷。这种要求已经成为实际的系统设计中最要紧的部分。 利用GUI快速开发程序 29 职场大变样社区(www.zcdby.com):下载毕业设计成品 图3-4 开发程序的过程图 接下来我们对流程进行一下详细的介绍: 1.创建工程: 图3-5 建立工程创建模板图 本次开发的项目是属于Qt Widgets Application。 30 职场大变样社区(www.zcdby.com):下载毕业设计成品 基类也就是要继承的类。Qt一共提供了三种基类,分别是:QMainWindow、QWidget、QDialog。创建工程的时候在创建图形界面文件处打上对勾,对于开发更为快捷、方便。 2.编译运行:把创建生成的空项目运行一下,会出现一个简单的图形界面,来验证创建的工程是否有误。 图3-6 程序的调试发布图 3.创建类: 图3-7 程序中创建新类演示图 选中项目文件,右击添加新文件,选择C++ Class,然后选择需要继承的类。 按照上述方法创建3.1.3中介绍的各种类和3.1.2中的界面选择相应的继承类。最后搭建好工程的雏形结构。 31 职场大变样社区(www.zcdby.com):下载毕业设计成品 图3-8 程序中创建新类演示图 创建完成以后,在图像格式转换的界面上用拖拽方式快速设计出3.3的界面,同时为每个对象设定好名称,方便以后对核心功能开发时调用这些对象。 3.3 小结 本章通过对系统需求的介绍以及详细的图解,说明了各个部分可以实现的功能、在结合图解的分析下,明确了详细设计所要包含的各个部分,通过每个部分功能的分析,可以看出整个项目所需要的具体功能点实现这些功能点所需要的技术的问题。 32 职场大变样社区(www.zcdby.com):下载毕业设计成品 4 软件功能测试 软件测试(英语:software testing),是指一种用来鉴定软件是否正确、完整、安全和质量的过程。通过使用已经写好的代码来检测找到其中隐藏的问题,从而防止软件在交付之后出现错误,造成不必要的损失。软件测试是软件开发过程中不可忽略的部分,贯穿在开发的始终。 4.1 测试的任务及目标 测试是软件开发过程中的一个不可忽略的部分,应该贯穿在我们开发项目的始终。测试在开发过程中的地位不言而喻,所以我们必须要重视测试。 4.1.1 测试的任务 在软件开发中,我们不可避免的产生许多错误,这使得软件中隐藏着许多的问题,而这些问题在一定的条件下被触发,便会让你更软件的运行出现差错,导致或多或少 发的经济损失,所以测试是非常必要的。因此在软件产品上市之前,必须尽可能多的现软件中的错误,才能将之后的经济损失降到最低。 4.1.2 测试的目标 (1)测试的目的是为了发现程序中的错误。 (2)好的测试 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 是尽可能多的发现到目前为止尚未发现的错误的测试方案。 4.1.3测试的原则 (1)测试应该尽早进行,最好在需求阶段就开始介入 (2)软件测试应该由第三方来负责,开发人员不应该测试自己编写的代码。 (3)设计测试用例时应考虑到合法的有效类和不合法的无效类以及各种边界条件。 33 职场大变样社区(www.zcdby.com):下载毕业设计成品 (4)应该注意软件测试过程中的群集现象。 (5)对测试的错误结果必须要进行一个精确的确认过程。一般由A测试出来的错误,一定要由B来确认。 (6)制定严格的测试计划。测试计划要有指导性,要想完成一个高质量、高水平的测试,测试的时间安排必须尽量宽松。 (7)妥善保存测试计划方案、测试的用例、出错统计和最终分析报告,为系统维护提供方便。 4.2 Qt下软件测试 Qt Creator自己并没有附带调试器,所以一定要利用操作系统中的调试器引擎,下面列出了一些在不同的平台下Qt Creator要到的调试器。 表1 Qt不同平台编译器和调试引擎 平台 编译器 调试器引擎 Linux,Unix,Mac OS gcc GNU Symbolic Debugger(gdb) Windows/MinGW gcc GNU Symbolic Debugger(gdb) Windows Microsoft Visual C++ Debugging Tools For Compiler Windows/Microsoft Console Debugger(CDB) 除了调试器之外,Qt也可以借助调试函数来实现调试的功能,如下: qDebug(),用来进行自定义的 调试输出。 qCritical(),用来报告 关键性错误信息和系统错误。 qFatal(),在程序退出前报告 致命性的错误。 qWarning(),用来报告应用程序中 警告性和可恢复性的错误。 用来报告 关键性错误信息和系统错误。 qCritical(), 34 职场大变样社区(www.zcdby.com):下载毕业设计成品 qFatal(),在程序退出前报告 致命性的错误。 4.2 双平台测试 4.2.1 Win7下测试 界面测试: 图4-1 程序运行主界面演示图 点击“浏览”->选择要转换的图片 点击“确定”->界面显示出选择的图片的路径 图4-2选择了图片文件,会在窗口中显示出来 选择要保存的文件的路径,转换文件保存到之后的combobox上便显示出所选的 35 职场大变样社区(www.zcdby.com):下载毕业设计成品 路径。如果存在同名的文件,则会出现存在同名文件是否覆盖。 图4-3 点击开始转换,进行转换 下面测试查看图片的功能,点击文件->打开,选择需要打开的文件,点击打开页面便会显示所选中的文件图片。 图4-4 图片查看界面 下面测试图片放大和缩小功能。点击查看下的放大或者缩小或着是快捷键栏的放大、缩小功能图标便可以实现放大缩小的功能。 36 职场大变样社区(www.zcdby.com):下载毕业设计成品 图4-5-1放大缩小功能 图4-5-2 放大缩小功能 4.2.2 Linux Ubuntu 16.04下测试 界面测试: 37 职场大变样社区(www.zcdby.com):下载毕业设计成品 图4-6 程序运行主界面演示图 点击“浏览”->选择要转换的图片,添加图片源文件就会出现所选图片的路径,转换文件保存到如果不选择路径的话默认为当前路径,系统会自动计算出选中图片的数量。 图4-7 选择了6个图片文件,会在窗口中显示出来 若有同名文件,提示是否覆盖同名文件。 38 职场大变样社区(www.zcdby.com):下载毕业设计成品 图4-8 转换完成后文件夹内容 Linux下显示图片和Linux风格的关于信息。 图4-9 显示Linux风格的关于界面 4.3 小结 在本章中,通过在Windows和Linux双平台下对软件的测试验证了软件项目的质量,分别对核心部分-图像格式转化和图片查看部分进行了测试,通过对这些部分的测试基本可以证明项目具有一定的健壮性和质量性。 39 职场大变样社区(www.zcdby.com):下载毕业设计成品 5 结论 这次论文的编写工作已经基本结束了,本论文采用了Qt开发技术,通过需求分析、设计和测试的过程,对软件格式转换器做了全面的阐述,也对于各个部分也做了详细的介绍,不仅对软件开发步骤做了详细的规划,也对软件开发的流程有一个明确的定义。 本文对基于qt技术的图像格式转化器系统进行了分析研究与实现,阐述了图像格式转换器系统的需求和应用Qt开发模式的软件体系结构,进一步熟悉了Qt及相关技术,了解了在不同开发平台下Qt技术的应用和其他相关技术,深入了解了Qt技术的信号与槽的核心机制。 该图像格式转换器系统实现了图像格式转换和图片查看、放大、缩小等各项功能, 预能够追朔到数据的始终。完成了图像格式转换器从需求到实现的开发过程,达到了期要求目的。该系统在开发过程中仍然存在许许多多的缺点,因为本人做系统程序的开发的经验有限,导致开发出来的软件的功能并不是很完善,图像格式转换的种类有限,图片查看功能比较简单,这些都是以后在系统设计需要注意和解决的问题。 40 职场大变样社区(www.zcdby.com):下载毕业设计成品 参考文献 [1] Prata S. C++ primer plus[M]. Sams, 2005. Wan [2] Blanchette J, Summerfield M. C++ GUI Programming with Qt 4, Second Edition[J]. Science of Computer Programming, 2015, 14(2-3):133–158. [3] Thelin J. Building Qt Projects[J]. Foundations of Qt Development, 2007. [4] 白玉霞, 刘旭辉, 孙肖子. 基于Qt/Embedded的GUI移植及应用程序开发[J]. 电子产品世界, 2005(13):98-100. [5] 韩少云. 基于嵌入式Linux的Qt图形程序实战开发[M]. 北京航空航天大学出版社, 2012. [6] 何剑锋, 邬文彪, 李宏穆,等. 嵌入式Linux系统的Qt/Embedded图形界面开发[J]. 电子工程师, 2007, 33(7):46-48. [7] 刘汇丹, 芮建武, 姚延栋,等. 基于Qt的国际化图形用户界面设计与实现[J]. 中文信息学报, 2006, 20(4):94-99. [8] 袁秋林, 马永杰, 张燕. 嵌入式图形引擎QT/E内核的C/S结构分析与优化[J]. 信息技术, 2009(4):80-81. [9] 殷立峰. Qt C++跨平台图形界面程序设计基础[M]. 清华大学出版社, 2014. [10] JASMIN BLANCHETTE(加). C++ GUI QT 4编程(第2版)[M]. 电子工业, 2008. 41 职场大变样社区(www.zcdby.com):下载毕业设计成品 致 谢 毕业设计即将进入尾声,在此次毕业设计的过程中,通过实际一整套项目的设计和实现,不仅让我学会了很多开发项目方面的知识而且巩固了以前所学的知识,还锻炼了我的动手能力和全面思考问题的能力,将所学的知识运用到实际的项目开发中,使我有勇气面对未来的挑战。 在本次毕业设计的过程中,得到了指导老师的指导与支持。在此特别感谢老师的大力帮助,在整体项目的把握上提供了非常有用的帮助,而且让我能够较快的理解整个系统的架构和意义,并且利用所学的知识完成设计与实现,虽然项目程序仍然有一些不完美的地方,但仍然能让我学到了很多的东西,在各个方面对自己的能力都有所提高。 另外我还要感谢我的母校,以及老师和同学们。在此次毕业设计的设计过程中,我遇到了许多的困难,但是由同学和老师的热情帮助,使得我能够按照计划完成了任务,今后的生活中,我一定会努力完善自己,热心帮助他人,为母校争光。 转眼间,我们即将毕业并且踏入社会。回首过去的大学生活,过得非常充实,有过痛苦也有过欢乐,而且也收获了很多的知识和友谊。感谢母校的各位老师传授给我们专业的知识,也在为人处世方面给予了我们非常多的指点和帮助。正是在这几个月紧张的毕业设计中,让我自己的知识又得到了一次升华,给我的四年大学生活画上一个圆满的句号。 42 职场大变样社区(www.zcdby.com):下载毕业设计成品 附录:英文技术资料翻译 英文原文: Event Processing ? Reimplementing Event Handlers ? Installing Event Filters ? Staying Responsive during Intensive Processing Events are generated by the window system or by Qt itself in response to various occurrences. When the user presses or releases akey or mouse button, a key or mouse event is generated; when a window is shown for the first time, a paint event is generated to tell the newly visible window that it needs to draw itself. Most events are generated in response to user actions, but some, such as timer events, are generated independently by the system. When we program with Qt, we seldom need to think about events, because Qt widgets emit signals when something significant occurs. Events become useful when we write our own custom widgets or when we want to modify the behavior of existing Qt widgets. Events should not be confused with signals. As a rule, signals are useful when using a widget, whereas events are useful when implementing a widget. For example, when we are using QPushButton, we are more interested in its clicked() signal than in the low-level mouse or key events that caused the signal to be emitted. But if we are implementing a class such as QPushButton, we need to write code to handle mouse and key events and emit the clicked() signal when necessary. Reimplementing Event Handlers In Qt, an event is an instance of a QEvent subclass. Qt handles more than a 43 职场大变样社区(www.zcdby.com):下载毕业设计成品 hundred types of events, each identified by an enum value. For example, QEvent::type() returns QEvent::MouseButtonPress for mouse press events. Many event types require more information than can be stored in a plain QEvent object; for example, mouse press events need to store which mouse button triggered the event as well as where the mouse pointer was positioned when the event occurred. This additional information is stored in dedicated QEvent subclasses, such as QMouseEvent. Events are notified to objects through their event() function, inherited from QObject. The event() implementation in QWidget forwards the most common types of events to specific event handlers, such as mousePressEvent(), keyPressEvent(), and paintEvent(). We have already seen many event handlers when implementing MainWindow, IconEditor, and Plotter in earlier chapters. Many other types of events are listed in the QEvent reference documentation, and it is also possible to create custom event types and to dispatch events ourselves. Here, we will review two common event types that deserve more explanation: key events and timer events. Key events are handled by reimplementing keyPressEvent() and keyReleaseEvent(). The Plotter widget reimplements keyPressEvent(). Normally, we only need to reimplement keyPressEvent() since the only keys for which release is important are the modifier keys Ctrl, Shift, and Alt, and these can be checked for in a keyPressEvent() using QKeyEvent::modifiers(). For example, if we were implementing a CodeEditor widget, its stripped-down keyPressEvent() that distinguishes between Home and Ctrl+Home would look like this: 44 职场大变样社区(www.zcdby.com):下载毕业设计成品 If the event is a key press, we cast the QEvent object to a QKeyEvent and check which key was pressed. If the key is Tab, we do some processing and return true to tell Qt that we have handled the event. If we returned false, Qt would propagate the event to the parent widget. A higher-level approach for implementing key bindings is to use a QAction. For example, if goToBeginningOfLine() and goToBeginningOfDocument() are public slots in the CodeEditor widget, and the CodeEditor is used as the central widget in a MainWindow class, we could add the key bindings with the following code: This makes it easy to add the commands to a menu or a toolbar, as we saw in Chapter 3. If the commands don't appear in the user interface, the QAction objects could be replaced with a QShortcut object, the class used internally by QAction to support key bindings. By default, key bindings set using QAction or QShortcut on a widget are enabled 45 职场大变样社区(www.zcdby.com):下载毕业设计成品 whenever the window that contains the widget is active. This can be changed using QAction::setShortcutContext() or QShortcut::setContext(). Another common type of event is the timer event. While most other event types occur as a result of a user action, timer events allow applications to perform processing at regular time intervals. Timer events can be used to implement blinking cursors and other animations, or simply to refresh the display. Qt offers five levels at which events can be processed and filtered: 1. We can reimplement a specific event handler. Reimplementing event handlers such as mousePressEvent(), keyPressEvent(), and paintEvent() is by far the most common way to process events. We have already seen many examples of this. 2. We can reimplement QObject::event(). By reimplementing the event() function, we can process events before they reach the specific event handlers. This approach is mostly needed to override the default meaning of the Tab key, as shown earlier (p. 168). This is also used to handle rare types of events for which no specific event handler exists (e.g., QEvent::HoverEnter). When wereimplement event(), we must call the base class's event() function for handling the cases we don't explicitly handle. 3. We can install an event filter on a single QObject. Once an object has been registered using installEventFilter(), all the events for the target object are first sent to the monitoring object's eventFilter() function. If multiple event filters are installed on the same object, the filters are activated in turn, from the most recently installed back to the first installed. 4. We can install an event filter on the QApplication object. Once an event filter has been registered for qApp (the unique QApplication object), every event for every object in the application is sent to the eventFilter() function before it is sent to any other event filter. This approach is mostly useful for 46 职场大变样社区(www.zcdby.com):下载毕业设计成品 debugging. It can also be used to handle mouse events sent to disabled widgets, which QApplication normally discards. 5. We can subclass QApplication and reimplement notify(). Qt calls QApplication::notify() to send out an event. Reimplementing this function is the only way to get all the events, before any event filters get the opportunity to look at them. Event filters are generally more useful, because there can be any number of concurrent event filters, but only one notify() function. Many event types, including mouse and key events, can be propagated. If the event has not been handled on the way to its target object or by the target object itself, the whole event processing process is repeated, but this time with the target object's parent as the new target. This continues, going from parent to parent, until either the event is handled or the top-level object is reached. Staying Responsive during Intensive Processing When we call QApplication::exec(), we start Qt's event loop. Qt issues a few events on startup to show and paint the widgets. After that, the event loop is running, constantly checking to see whether any events have occurred and dispatching these events to QObjects in the application. While one event is being processed, additional events may be generated and appended to Qt's event queue. If we spend too much time processing a particular event, the user interface will become unresponsive. For example, any events generated by the window system while the application is saving a file to disk will not be processed until the file is saved. During the save, the application will not respond to requests from the window system to repaint itself. One solution is to use multiple threads: one thread for the application's user interface and another thread to perform file saving (or any other time-consuming operation). This way, the application's user interface will stay responsive while the file is being saved. 47 职场大变样社区(www.zcdby.com):下载毕业设计成品 A simpler solution is to make frequent calls to QApplication::processEvents() in the file saving code. This function tells Qt to process any pending events, and then returns control to the caller. In fact, QApplication::exec() is little more than a while loop around a processEvents() function call. The need to read from or write to files or other devices is common to almost every application. Qt provides excellent support for I/O through QIODevice, a powerful abstraction that encapsulates "devices" capable of reading and writing blocks of bytes. Qtincludes the following QIODevice subclasses: QFile Accesses files in the local file system and in embedded resources QTemporaryFile Creates and accesses temporary files in the local file system QBuffer Reads data from or writes data to a QByteArray QProcess Runs external programs and handles inter-process communication QTcpSocket Transfers a stream of data over the network using TCP QUdpSocket Sends or receives UDP datagrams over the network QSslSocket Transfers an encrypted data stream over the network using SSL/TLS QProcess, QTcpSocket, QUdpSocket, and QSslSocket are sequential devices, meaning that the data can be accessedonly once, starting from the first byte and progressing serially to the last byte. QFile, QTemporaryFile, and QBuffer are random-access devices, so bytes can be read any number of times from any position; they provide the QIODevice::seek() function for repositioning the file pointer. In addition to the device classes, Qt also provides two higher-level stream classes that we can use to read from, and write to, any I/O device: QDataStream for binary data and QTextStream for text. These classes take care of issues such as byte ordering and text encodings, ensuring that Qt applications running on different platforms or in different countries can read and write each other's files. This makes Qt's I/O classes much more convenient than the corresponding Standard C++ classes, which leave these issues to the application programmer. 48 职场大变样社区(www.zcdby.com):下载毕业设计成品 QFile makes it easy to access individual files, whether they are in the file system or embedded in the application's executable as resources. For applications that need to identify whole sets of files to work on, Qt provides the QDir and QFileInfo classes,which handle directories and provide information about the files inside them. The QProcess class allows us to launch external programs and to communicate with them through their standard input, standard output, and standard error channels (cin, cout, and cerr). We can set the environment variables and working directory that the external application will use. By default, communication with the process is asynchronous (non-blocking), but it is also possible to block on certain operations. 注:本文来源于《c++ GUI Programming with Qt 4》Second Edition 49 职场大变样社区(www.zcdby.com):下载毕业设计成品 中文译文: 事 件 处 理 事件(event)是由窗口系统或者Qt自身产生的,用以响应所发生的各类事情。当用户按下或者松开键盘或者鼠标上的按键时,就可以产生一个键盘或者鼠标事件;当某个窗口第一次显示的时候,就会产生一个绘制事件,用来告知窗口需要重新绘制它本身,从而使得该窗口可见。大多数事件是作为用户动作的响应而产生的,但是也有一些例外,比如像定时器事件,则是由系统独立产生的。 在使用Qt进行编程开发时,基本不需要考虑事件,因为在发生某些重要的事情时,Qt窗口部件都会发射信号。但是当我们需要编写自己的自定义窗口部件,或者是当我们希望改变已经存在的Qt 窗口部件的行为时,事件就变得非常有用了。 不应该混淆“事件”和“信号”这两个概念。一般情况下,在使用窗口部件的时候,信号是十分有用的;而在实现窗口部件时,事件则是十分有用的。例如,当使用QPushbutton时,我们对于它的 clicked()信号往往更为关注,而很少关心促成发射该信号的底层鼠标或者键盘事件。但是,如果要实现的是一个类似于QPushButton 的类,就需要编写一定的处理鼠标和键盘事件的代码,而且在必要的时候,还需要发射 )信号。 clicked( 重新实现事件处理器 在 Qt 中,事件就是 QEvent 子类的一个实例。Qt 处理的事件类型有一百多种 ,其中的每一种都可以通过一个枚举值来进行识别。例如,QEvent::type ( )可以返回用于处理鼠标按键事件的QEvent::MouseButtonPresse。 许多事件类型需要的信息要比存储在普通QEvent 对象中的信息多得多。例如,鼠标按键事件既需要保存是哪一个按键激发了该事件的信息,又需要保存发生该事件时鼠标指针所在的位置信息。这些额外信息就需要存储在专用的QEvent 子类中,比如QMouseEvent 。 50 职场大变样社区(www.zcdby.com):下载毕业设计成品 通过继承QObject,事件通过它们的event( )函数来通知对象。在QWidget 中的 event ( )实现把绝大多数常用类型的事件提前传递给特定的事件处理器,比如mouseePressEvent ( )、keyPressEvent ( )以及paintEvent ( )。 在前几章中,当实现 MainWindow 、IconEditor 和 Plotter 时,我们已经看到过许多事件处理器 。在 QEvent 的参考文档中,还列出了很多其他类型的事件,并且也可以自己创建一些自定义事件类型和发布一些事件。在此将会回顾两种值得详述的常用事件类型:键盘事件和定时器事件。 通过重新实现 keyPressEvent ( )和 keyReleaseEvent ( ),就可以处理键盘事件了。Plotter 窗口部件就重新实现了keyPressEvent( )。通常,我们只需要重新实现 keyPressEvent ( ) 就可以了,因为用于表明释放重要性的键只是 Ctrl 、Shift 和 Alt 这些修饰键,而这些键的状态可以在keyPressEvent ( )中使用 QKeyEvent: :modifiers()检测出来。例如,如果我们正打算实现一个CodeEditor 窗口部件,那么要区分按下的键是Horne还是Ctrl + Home,它的keyPressEvent ()函数中的部分内容看起来应当是这样的: 如果该事件是一个按键事件,那么就把这个 QEvent 对象强制转换成 QKeyEvent 并且检查按下的是哪个键。如果按下的键是 Tab 键,就做一些处理并返回 true,告诉 已经把这个事件处理完毕了。如果返回的是 false,那么 Qt 将会把这个事件传递给它的父窗口部件来处理。 实现键绑定的一种更为高级的方法是使用 QAction 。例如,如果在 CodeEditor 窗口部件中有 goToBeginningOfLine() 和 goToBeginningDocument ( ) 两个公有槽, 51 职场大变样社区(www.zcdby.com):下载毕业设计成品 并且这个 CodeEditor 是用作Main?Window 类的中央窗口部件的,那么本可以使用下面的代码来添加键绑定: 这样就可以很容易地把这个命令添加到菜单或者工具栏中了。如果这些命令没有出现在用户界面中,那么就可以用一个 QShortcut 对象替换这些 QAction 对象,这个 类在 QAction 内部用来支持键绑定。 默认情况下,一旦把包含窗口部件的窗口激活,就可以在该窗口部件上使用 QAction或 QShortcut来启用所设置的绑定键。但使用 QAction::setShortcutContent( ) 或者 QShortcut::setContext()可以改变这一点。 另外一种常用的事件类型是定时器事件。虽然绝大多数的其他事件类型的发生是因为用户的动作,但是定时器事件允许应用程序可以在一定的时间间隔后执行事件处理。定时器事件可以用来实现光标的闪烁和其他动画的播放,或者只简单地用作显示的刷新。 为了说明定时器事件,我们将会实现一个Ticker 窗口部件。这个窗口部件显示了一串文本标语,它会每30毫秒向左移动一个像素。如果窗口部件比文本宽,那么文本将会被多次重复,直到能够填满整个窗口部件的宽度为止 。 Qt 提供了5个级别的事件处理和事件过滤方法 。 1. 重新实现特殊的事件处理器 重新实现像 mousePressEvent () 、keyPressEvent ()和 paintEvent ( )这样的事件处理器是到现在为止最常用的事件处理方式。我们已经看到很多有关这种处理方式的例子了。 2. 重新实现 QObject: :event ( ) 52 职场大变样社区(www.zcdby.com):下载毕业设计成品 通过event()函数的重新实现,可以在这些事件到达特定的事件处理器之前处理它们。这种方式常用于覆盖 Tab 键的默认意义,就像在前面看到的那样。这种方式也可以用于处理那些没有特定事件处理器的不常见类型的事件中(例如,QEvent: :HoverEnter)。当重新实现 event( ) 时,必须对那些没有明确处理的情况调用其基类的 event( )函数。 3. 在QObject 中安装事件过滤器 对象一旦使用 installEventFilter()注册过,用于目标对象的所有事件都会首先发送给这个监视对象的 eventFilter( )函数。如果在同一个对象上安装了多个事件处理器,那么就会按照安装顺序逆序,从最近安装的到最先安装的,依次激活这些事件处理器。 4. 在 QApplication 对象中安装事件过滤器 一旦在 qApp(唯一的 QApplication 对象)中注册了事件过滤器,那么应用程序中每个对象的每个事件都会在发送到其他事件过滤器之前,先发送给这个 eventFilter( ) 函数。这种处理方式对于调试是非常有用的。它也可以用来处理那些发送给失效窗口 部件的鼠标事件 ,因为 QApplication 通常都会忽略这些事件。 5. 子类化 QApplication 并且重新实现 notify( ) Qt 调用 QApplication::notify()来发送一个事件。重新实现这个函数是在事件过滤器得到所有事件之前获得它们的唯一方式。事件过滤器通常更有用,因为可以同时有多个事件过滤器,而 notify()函数却只能有一个。 很多事件类型,包括鼠标事件和按键事件,都可以对它们进行传递 。如果在事件到达它的目标对象之前没有得到处理,或者也没有被它自己的目标对象处理,那么就会重复整个事件的处理过程,但这一次会把目标对象的父对象当作新的目标对象。这样一直继续下去,从父对象再到父对象的父对象,直到这个事件完全得到处理或者是到达了最顶层的对象为止。 处理密集时的晌应保持 当调用 QApplication::exec()时,就启动了Qt的事件循环。在开始的时候,Qt 会发出一些事件命令来显示和绘制窗口部件。在这之后,事件循环就开始运行,它不断检查是否有事件发生并且把这些事件发送给应用程序中的 QObject。 53 职场大变样社区(www.zcdby.com):下载毕业设计成品 当处理一个事件时,也可能会同时产生一些其他的事件并且会将其追加到 Qt 的事件队列中。如果在处理一个特定事件上耗费的时间过多,那么用户界面就会变得无法响应。例如,在应用程序把一个文件保存到磁盘的过程中,直到文件保存完毕,才会处理那些由窗口系统产生的事件。在文件保存过程中,应用程序就不能响应来自窗口系统的重新绘制的请求。 在此情况下,一种解决方法就是使用多线程:一个线程用于处理应用程序的用户界面,另外一个线程则执行文件保存操作(或者任意的其他耗时操作)。这样的话,在保存文件的时候,应用程 序的用户界面仍然可以保持响应。一种更为简单的解决方法是在文件保存的代码中频繁调用 QApplication:: processEvents ( ) 。这个函数告诉 Qt 处理所有那些还没有被处理的各类事件,然后再将控制权返还给调用者。实际上 , QApplication::exec()就是一个不停调用 processEvents ()函数的while 循环。 从文件或者其他设备读取或者写人数据几乎是每个应用 程序共有的特点。Qt 通过 QIODevice 为输入输出提供了极佳的支持 。QIODevice 是一个封装能够读写字节块“设备”的强有力的提取器。Qt 包括如下的 QIODevice 子类: QFile 在本地文件系统和嵌入式资源中存取文件 QTemporaryFile 在本地文件系统中创建并存取临时文件 QBuffer 从 QByteAnay 中读取或者写人数据 QProcess 运行外部程序并处理进程间通信 QTcpSocket 利用于四在网络上传输数据流 QUdpSocket在网络上发送或接收 UDP 数据报 QSslSocket利用 SSUTI.5 在网络上传输加密数据流 QProcesscp、QTcpSocket 、QUdpSocket 和 Ss1Socket 都是顺序存储设备,这意味着所存储的数据从第一个字节开始到最后一个字节为止只能被读取一次。QFile 、QTemporaryFile 和 QBuffer 则是随机存取设备,因此可以从任意位置多次读取字节位所存储的数据。这些随机存取设备还提供了QIODevice::seek ()函数以重新配置文件指针。 除了设备类,Qt 还提供了两个更高级别的流类,使我们可以从任意的输入输出设备读取或写 人数据:QDataStream 用来读写二进制数据,QTextStream 用来读写文本 54 职场大变样社区(www.zcdby.com):下载毕业设计成品 数据。这些类考虑了诸如字节顺序与文本编码等方面的问题,以保证运行在不同平台或者不同语言环境下的Qt应用程序可以相互读写文件。这就使得 Qt 的输入输出类相较于对应的标准 C,,类来说,变得更加方便了,后 者通常是将字节排序与文本编码等 问题留给了程序员来处理的。 QFile 使存取单个文件变得简单,不论它们是在文件系统中还是作为资源嵌入在应用程序的可执行文件中。对于需要依靠整个文件组集一同运作的应用程序,Qt 提供了 QDir 和 QFilelnfo 类,它们分别用于处理目录地址和提供内部文件信息。 QProcess 类允许启动外部程序并通过标准输入、输出以及标准错误通道( cin 、cout 和 cerr) 与外部程序交互。可以设置外部程序的环境变量和工作目录。在默认情况下,交互的执行过程是异步的(不阻塞的),但是不排除在某些操作上发生阻塞的可能。 55
本文档为【基于qt的图像格式转换器设计与实现论文】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_037433
暂无简介~
格式:doc
大小:482KB
软件:Word
页数:0
分类:工学
上传时间:2017-09-02
浏览量:43