基于QT的GUI程序设计

上传人:cl****1 文档编号:590351110 上传时间:2024-09-13 格式:PPT 页数:108 大小:4.10MB
返回 下载 相关 举报
基于QT的GUI程序设计_第1页
第1页 / 共108页
基于QT的GUI程序设计_第2页
第2页 / 共108页
基于QT的GUI程序设计_第3页
第3页 / 共108页
基于QT的GUI程序设计_第4页
第4页 / 共108页
基于QT的GUI程序设计_第5页
第5页 / 共108页
点击查看更多>>
资源描述

《基于QT的GUI程序设计》由会员分享,可在线阅读,更多相关《基于QT的GUI程序设计(108页珍藏版)》请在金锄头文库上搜索。

1、基于基于QTQT的的GUIGUI程序设计程序设计www.gec-edu.org目录目录GUI基础基础1认识认识QT快速入门快速入门2QT进阶进阶信号与槽信号与槽3www.gec-edu.org什么是什么是GUIv图形用户界面图形用户界面v(GraphicalUserInterface,简称,简称GUI,又称图形用户接口)是指采用图形方式显示的计又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。准确来说算机操作用户界面。准确来说GUI就是屏幕产就是屏幕产品的视觉体验和互动操作部分。品的视觉体验和互动操作部分。v与早期计算机使用的命令行界面相比,图形界面与早期计算机使用的命令行界面相比,

2、图形界面对于用户来说在视觉上更易于接受。对于用户来说在视觉上更易于接受。www.gec-edu.orgGUI发展发展v70年代,施乐公司年代,施乐公司XeroxPaloAltoResearchCenter(PARC)的研究人员开发了第一个的研究人员开发了第一个GUI图形用户界面,开启了计算图形用户界面,开启了计算机图形界面的新纪元,机图形界面的新纪元,80年代以来,操作系统的界面设计经历了众年代以来,操作系统的界面设计经历了众多变迁,多变迁,OS/2,Windows,Linux,SymbianOS,各种操作,各种操作系统将系统将GUI设计带进新的时代。现简单介绍介绍设计带进新的时代。现简单介绍

3、介绍80年代以来各种操年代以来各种操作系统作系统GUI界面设计的进化史。界面设计的进化史。v第一个使用现代图形界面的个人电脑是第一个使用现代图形界面的个人电脑是XeroxAlto,设计于,设计于1973年,该系统并未商用,主要用于研究和大学。年,该系统并未商用,主要用于研究和大学。v1981-1985Xerox8010Star(1981年推出年推出)这是第一台全集成桌面电脑,包含应用程序和图形用户界面(这是第一台全集成桌面电脑,包含应用程序和图形用户界面(GUI),),一开始叫一开始叫The Xerox Star,后改名为后改名为ViewPoint, 最后又改名最后又改名为为 GlobalVi

4、ew。www.gec-edu.orgGUI发展发展www.gec-edu.orgGUI发展发展vAppleLisaOfficeSystem1(1983)又称又称LisaOS,这里的,这里的OS是是OfficeSystem的缩写,苹果开发这款机的缩写,苹果开发这款机器的初衷是作为文档处理工作站。不幸的是,这款机器的寿命并不长,很快器的初衷是作为文档处理工作站。不幸的是,这款机器的寿命并不长,很快被更便宜的被更便宜的Macintosh操作系统取代。操作系统取代。LisaOS几个升级包括几个升级包括1983年年的的LisaOS2,1984年的年的LisaOS7/73.1。www.gec-edu.or

5、gGUI发展发展vVisiCorpVisiOn(1984)VisiOn是为是为IBMPC开发的第一款桌面开发的第一款桌面GUI,该系统面向大型企业,价,该系统面向大型企业,价格昂贵,使用基于鼠标的格昂贵,使用基于鼠标的GUI,它内置安装程序与帮助系统,但尚未使用图,它内置安装程序与帮助系统,但尚未使用图标。标。www.gec-edu.orgGUI发展发展vMacOSSystem1.0(1984)System1.0是最早的是最早的Mac操作系统操作系统GUI,已经拥有现代操作系统的几,已经拥有现代操作系统的几项特点,基于窗体项特点,基于窗体,使用图标。窗体可以用鼠标拖动,文件与文件夹可以通过使用

6、图标。窗体可以用鼠标拖动,文件与文件夹可以通过拖放进行拷贝。拖放进行拷贝。www.gec-edu.orgGUI发展发展vAmigaWorkbench1.0(1985)一经发布,一经发布,Amiga就领先时代。它的就领先时代。它的GUI包含诸如彩色图形(四色包含诸如彩色图形(四色:黑,白,黑,白,蓝,橙),初级多任务,立体声以及多状态图标(选中状态和未选中状态)蓝,橙),初级多任务,立体声以及多状态图标(选中状态和未选中状态)www.gec-edu.orgGUI发展发展vWindows1.0x(1985)1985年,微软终于在图形用户界面大潮中占据了一席之地,年,微软终于在图形用户界面大潮中占据

7、了一席之地,Windows1.0是其第一款基于是其第一款基于GUI的操作系统的操作系统。使用了。使用了32x32像素的图标以及彩像素的图标以及彩色图形,其最有趣的功能是模拟时钟动画图标。色图形,其最有趣的功能是模拟时钟动画图标。www.gec-edu.orgGUI发展发展vWindows2.0x(1987)这个版本的这个版本的Windows操作系统中对操作系统中对Windows的管理有了很大改进,的管理有了很大改进,Windows可以交叠,改变大小,最大化或最小化可以交叠,改变大小,最大化或最小化www.gec-edu.orgGUI发展发展vOS/21.x(releasedin1988)OS/

8、2最早由最早由IBM和微软合作开发,然而和微软合作开发,然而1991年,随着微软将这些技术年,随着微软将这些技术放到自己的放到自己的Windows操作系统,两家公司决裂,操作系统,两家公司决裂,IBM继续开发继续开发OS/2,OS/2使用的使用的GUI被称为被称为“PresentationManager(展示管理)(展示管理)”,这个版本的,这个版本的GUI固定图标。固定图标。www.gec-edu.orgGUI发展发展vOS/21.20(1989)OS/2的下一个小版本在很多方面都做了改进,图标看上去更好看,窗体也的下一个小版本在很多方面都做了改进,图标看上去更好看,窗体也显得更平滑。显得更

9、平滑。www.gec-edu.orgGUI发展发展vWindows3.0(1990)到到Windows3.0,微软真正认识到微软真正认识到GUI的威力,并对之进行大幅度改进。的威力,并对之进行大幅度改进。该操作系统已经支持标准或该操作系统已经支持标准或386增强模式,在增强模式中,可以使用增强模式,在增强模式中,可以使用640K以上的扩展内存,让更高的屏幕分辨率和更好的图形成为可能,比如可以支以上的扩展内存,让更高的屏幕分辨率和更好的图形成为可能,比如可以支持持SVGA800x600或或1024x768。同时,微软聘请同时,微软聘请SusanKare设计设计Windows3.0的图标,为的图标

10、,为GUI注注入统一的风格。入统一的风格。www.gec-edu.orgGUI发展发展vMacOSSystem7(releasedin1991)MacOS7是第一款支持彩色的是第一款支持彩色的GUI,图标中加入了微妙的灰,蓝,黄阴影。,图标中加入了微妙的灰,蓝,黄阴影。www.gec-edu.org现代现代GUIwww.gec-edu.orgLinux下的桌面下的桌面GUIKDEgnomewww.gec-edu.orgLinux下的桌面下的桌面GUIvKDE与与GNOME是是Linux/UNIX系统流行系统流行的图形操作环境。从上个世纪九十年代中期至今,的图形操作环境。从上个世纪九十年代中期至

11、今,KDE和和GNOME都经历了将近十年的漫漫历程,都经历了将近十年的漫漫历程,两者也都从最初的设计粗糙、功能简陋发展到相两者也都从最初的设计粗糙、功能简陋发展到相对完善的阶段,可用性逼近对完善的阶段,可用性逼近Windows系统。系统。www.gec-edu.orgLinux下的桌面下的桌面GUIvXWindow打造桌面环境打造桌面环境vLinux实际上是以实际上是以UNIX为模板的,它继承了为模板的,它继承了UNIX内核设计精简、高度健壮的特点,无论系统结构还是操作内核设计精简、高度健壮的特点,无论系统结构还是操作方式也都与方式也都与UNIX无异。无异。v微软微软Windows在早期只是一

12、个基于在早期只是一个基于DOS的应用程的应用程序,用户必须首先进入序,用户必须首先进入DOS后再启动后再启动Windows进程,进程,而从而从Windows95开始,微软将图形界面作为默认,命开始,微软将图形界面作为默认,命令行界面只有在需要的情况下才开启,后来的令行界面只有在需要的情况下才开启,后来的Windows98/Me实际上也都隶属于该体系。但在实际上也都隶属于该体系。但在Windows2000之后,之后,DOS被彻底清除,被彻底清除,Windows成为一个完成为一个完全图形化的操作系统。全图形化的操作系统。v但但UNIX/Linux与之不同,强大的命令行界面始终与之不同,强大的命令行

13、界面始终是它们的基础,在上个世纪八十年代中期,图形界面风潮是它们的基础,在上个世纪八十年代中期,图形界面风潮席卷操作系统业界,麻省理工学院(席卷操作系统业界,麻省理工学院(MIT)也在)也在1984年年与当时的与当时的DEC公司合作,致力于在公司合作,致力于在UNIX系统上开发一个系统上开发一个分散式的视窗环境,这便是大名鼎鼎的分散式的视窗环境,这便是大名鼎鼎的“XWindowSystem”项目。项目。www.gec-edu.orgLinux下的桌面下的桌面GUIvXWindow(不是(不是XWindows)v其不是一个直接的图形操作环境,而是作为图形环境其不是一个直接的图形操作环境,而是作为

14、图形环境与与UNIX系统内核沟通的中间桥梁,任何厂商都可以在系统内核沟通的中间桥梁,任何厂商都可以在XWindow基础上开发出不同的基础上开发出不同的GUI图形环境。图形环境。MIT和和DEC的目的只在于为的目的只在于为UNIX系统设计一套简单的图形框架,系统设计一套简单的图形框架,以使以使UNIX工作站的屏幕上可显示更多的命令,对于工作站的屏幕上可显示更多的命令,对于GUI的精美程度和易用程度并不讲究,毕竟那时候能够熟练操的精美程度和易用程度并不讲究,毕竟那时候能够熟练操作作UNIX的都是些习惯命令行的高手,根本不在乎的都是些习惯命令行的高手,根本不在乎GUI存存在与否。在与否。v1986年

15、,年,MIT正式发行正式发行XWindow,此后它便成,此后它便成为为UNIX的标准视窗环境。紧接着,全力负责发展该项目的标准视窗环境。紧接着,全力负责发展该项目的的X协会成立,协会成立,XWindow进入了新阶段。与此同步,进入了新阶段。与此同步,许多许多UNIX厂商也在厂商也在XWindow原型上开发适合自己的原型上开发适合自己的UNIXGUI视窗环境,其中比较著名的有视窗环境,其中比较著名的有SUN与与AT&T联手开发的联手开发的“OpenLook”、IBM主导下的主导下的OSF(OpenSoftwareFoundation,开放软件基金会)开发出的,开放软件基金会)开发出的“Motif

16、”。www.gec-edu.orgLinux下的桌面下的桌面GUIv一些爱好者则成立了非营利的一些爱好者则成立了非营利的XFree86组织,致组织,致力于在力于在X86系统上开发系统上开发XWindow,这套免费,这套免费且功能完整的且功能完整的XWindow很快就进入了商用很快就进入了商用UNIX系统中,且被移植到多种硬件平台上,后系统中,且被移植到多种硬件平台上,后来的来的Linux也直接从该项目中获益。当然,这些也直接从该项目中获益。当然,这些早期的早期的XWindow环境都设计得很简单,许多环境都设计得很简单,许多GUI元素模仿于微软的元素模仿于微软的Windows,但,但XWindo

17、w拥有一个小小的创新:当鼠标指针移动拥有一个小小的创新:当鼠标指针移动到某个窗口时,该窗口会被自动激活,用户无需到某个窗口时,该窗口会被自动激活,用户无需点击便能够直接输入,简化了用户操作点击便能够直接输入,简化了用户操作这个特这个特性在后来的性在后来的KDE和和Gnome中也都得到完整的继中也都得到完整的继承。承。www.gec-edu.orgLinux下的桌面下的桌面GUIv由于必须以由于必须以UNIX系统作为基础,系统作为基础,XWindow注定只能注定只能成为成为UNIX上的一个应用,而不可能与操作系统内核高度上的一个应用,而不可能与操作系统内核高度整合,这就使得基于整合,这就使得基于

18、XWindow的图形环境不可能有很的图形环境不可能有很高的运行效率,但它的优点在于拥有很强的设计灵活性和高的运行效率,但它的优点在于拥有很强的设计灵活性和可移植性。可移植性。vXWindow从逻辑上分为三层:最底层的从逻辑上分为三层:最底层的XServer(X服务器)主要处理输入服务器)主要处理输入/输出信息并维护相关资源,它接输出信息并维护相关资源,它接受来自键盘、鼠标的操作并将它交给受来自键盘、鼠标的操作并将它交给XClient(X客户端)客户端)作出反馈,而由作出反馈,而由XClient传来的输出信息也由它来负责传来的输出信息也由它来负责输出;最外层的输出;最外层的XClient则提供一

19、个完整的则提供一个完整的GUI界面,界面,负责与用户的直接交互(负责与用户的直接交互(KDE、Gnome都是一个都是一个XClient),而衔接),而衔接XServer与与XClient的就是的就是“XProtocol(X通讯协议通讯协议)”、它的任务是充当这两者的沟通管道。尽、它的任务是充当这两者的沟通管道。尽管管UNIX厂商采用相同的厂商采用相同的XWindow,但由于终端的,但由于终端的XClient并不相同,这就导致不同并不相同,这就导致不同UNIX产品搭配的产品搭配的GUI界面看起来非常不一样。界面看起来非常不一样。www.gec-edu.orgLinux下的桌面下的桌面GUIv在上

20、个世纪九十年代中期,以开源模式推进的在上个世纪九十年代中期,以开源模式推进的Linux在开在开发者中已经拥有广泛的影响力。尽管发者中已经拥有广泛的影响力。尽管XWindow已经非已经非常成熟,也有不少基于常成熟,也有不少基于XWindow的图形界面程序,但的图形界面程序,但它们不是未具备完整的图形操作功能就是价格高昂,根本它们不是未具备完整的图形操作功能就是价格高昂,根本无法用于无法用于Linux系统中。如果系统中。如果Linux要获得真正意义上的要获得真正意义上的突破,一套完全免费、功能完善的突破,一套完全免费、功能完善的GUI就非常必要。就非常必要。1996年年10月,图形排版工具月,图形

21、排版工具Lyx的开发者、一位名为的开发者、一位名为MatthiasEttrich的德国人发起了的德国人发起了KDE(KoolDesktopEnvironment)项目,与之前各种基于)项目,与之前各种基于XWindow的图形程序不同的是,的图形程序不同的是,KDE并非针对系统管理并非针对系统管理员,它的用户群被锁定为普通的终端用户,员,它的用户群被锁定为普通的终端用户,MatthiasEttrich希望希望KDE能够包含用户日常应用所需要的所有应能够包含用户日常应用所需要的所有应用程序组件,例如用程序组件,例如Web浏览器、电子邮件客户端、办公浏览器、电子邮件客户端、办公套件、图形图像处理软件

22、等等,将套件、图形图像处理软件等等,将UNIX/Linux彻底带彻底带到桌面。当然,到桌面。当然,KDE符合符合GPL规范,以免费和开放源代规范,以免费和开放源代码的方式运行。码的方式运行。www.gec-edu.orgLinux下的桌面下的桌面GUIvKDE项目发起后,迅速吸引了一大批高水平的自由软件开项目发起后,迅速吸引了一大批高水平的自由软件开发者,这些开发者都希望发者,这些开发者都希望KDE能够将能够将Linux系统的强大系统的强大能力与舒适直观的图形界面联结起来,创建最优秀的桌面能力与舒适直观的图形界面联结起来,创建最优秀的桌面操作系统。经过艰苦卓绝的共同努力,操作系统。经过艰苦卓绝

23、的共同努力,KDE1.0终于在终于在1998年的年的7月月12日正式推出。但仍远远比不上同时期的日正式推出。但仍远远比不上同时期的Windows98来得平易近人,来得平易近人,KDE1.0中大量的中大量的Bug更是让人头疼。但对开发人员来说,更是让人头疼。但对开发人员来说,KDE1.0的推出鼓的推出鼓舞人心,它证明了舞人心,它证明了KDE项目开源协作的开发方式完全可行项目开源协作的开发方式完全可行,开发者对未来充满信心。,开发者对未来充满信心。v在在KDE1.0版的开发过程中,版的开发过程中,SUSE、Caldera等等Linux商业公司对该项目提供资金上的支持,在商业公司对该项目提供资金上的

24、支持,在1999年,年,IBM、Corel、Redhat、富士通、富士通-西门子等公司也纷纷西门子等公司也纷纷对对KDE项目提供资金和技术支持,自此项目提供资金和技术支持,自此KDE项目走上了项目走上了快速发展阶段并长期保持着领先地位。快速发展阶段并长期保持着领先地位。www.gec-edu.orgLinux下的桌面下的桌面GUIvKDE1.0尽管设计粗糙,但它奠定了整个尽管设计粗糙,但它奠定了整个KDE项目的基项目的基础。础。www.gec-edu.orgLinux下的桌面下的桌面GUIvQt是一个跨平台的是一个跨平台的C+图形用户界面库,它是挪威图形用户界面库,它是挪威TrollTech公

25、司的产品,诞生于公司的产品,诞生于1994年。基本上,年。基本上,Qt同同XWindow上的上的Motif、OpenLook、GTK等图形等图形界面库和界面库和Windows平台上的平台上的MFC、OWL、VCL、ATL是同类型的东西,但是同类型的东西,但Qt具有优良的跨平台特性(支具有优良的跨平台特性(支持持Windows、Linux、各种、各种UNIX、OS390和和QNX等)、面向对象机制以及丰富的等)、面向对象机制以及丰富的API,同时也可支持,同时也可支持2D/3D渲染和渲染和OpenGLAPI。在当时的同类图形用户。在当时的同类图形用户界面库产品中,界面库产品中,Qt的功能最为强大

26、,的功能最为强大,MatthiasEttrich在发起在发起KDE项目时很自然选择了项目时很自然选择了Qt作为开发基础,也正作为开发基础,也正是得益于是得益于Qt的完善性,的完善性,KDE的开发进展颇为顺利。的开发进展颇为顺利。TrollTech公司对于公司对于KDE项目拥有非常强的影响力(当项目拥有非常强的影响力(当然不能说绝对掌握,毕竟然不能说绝对掌握,毕竟KDE开发工作仍然是由自由程序开发工作仍然是由自由程序员协作完成的)。员协作完成的)。www.gec-edu.orgLinux下的桌面下的桌面GUIvKDE采用采用GPL规范进行发行,但底层的基础规范进行发行,但底层的基础Qt却是一个不

27、遵循却是一个不遵循GPL的商业软件,这就给的商业软件,这就给KDE上上了一道无形的枷锁并带来可能的法律风险。一大了一道无形的枷锁并带来可能的法律风险。一大批自由程序员对批自由程序员对KDE项目的决定深为不满,它们项目的决定深为不满,它们认为利用非自由软件开发违背了认为利用非自由软件开发违背了GPL的精神,于的精神,于是这些是这些GNU的狂热信徒兵分两路:其中一部分人的狂热信徒兵分两路:其中一部分人去制作去制作Harmonny,试图重写出一套兼容,试图重写出一套兼容Qt的的替代品,这个项目虽然技术上相对简单,但却没替代品,这个项目虽然技术上相对简单,但却没有获得有获得KDE项目的支持;另一路人马

28、则决定重新项目的支持;另一路人马则决定重新开发一套名为开发一套名为“GNOME(GNUNetworkObjectEnvironment)”的图形环境来替代的图形环境来替代KDE,一场因为思想分歧引发的,一场因为思想分歧引发的GUI之战开始了。之战开始了。www.gec-edu.orgLinux下的桌面下的桌面GUIvQt是整个是整个KDE的基础的基础vGNOME与与KDE交替发展交替发展www.gec-edu.orgLinux下的桌面下的桌面GUIvGNOME项目于项目于1997年年8月发起,创始人是当时年仅月发起,创始人是当时年仅26岁的墨西哥程序员岁的墨西哥程序员MiguelDeIcaza

29、。关于。关于GNOME的名称有一个非常有趣的典故:的名称有一个非常有趣的典故:Miguel到微软到微软公司应聘时对它的公司应聘时对它的ActiveX/COMmodel颇有兴趣,颇有兴趣,GNOME(NetworkObjectModel)的名称便从此)的名称便从此而来。而来。vGNOME选择完全遵循选择完全遵循GPL的的GTK图形界面库为基础,图形界面库为基础,因此我们也一般将因此我们也一般将GNOME和和KDE两大阵营称为两大阵营称为GNOME/GTK和和KDE/Qt。v与与Qt基于基于C+语言不同,语言不同,GTK采用较传统的采用较传统的C语言,虽语言,虽然然C语言不支持面向对象设计,看起来

30、比较落后,但当时语言不支持面向对象设计,看起来比较落后,但当时熟悉熟悉C语言的开发者远远多于熟悉语言的开发者远远多于熟悉C+的开发者。加之的开发者。加之GNOME/GTK完全遵循完全遵循GPL版权公约,吸引了更多的自版权公约,吸引了更多的自由程序员参与,但由于由程序员参与,但由于KDE先行一步,且基础占优势,一先行一步,且基础占优势,一直都保持领先地位。直都保持领先地位。www.gec-edu.orgLinux下的桌面下的桌面GUIvGNOME的转机来自于商业公司的支持。当时的转机来自于商业公司的支持。当时Linux业界的老大业界的老大RedHat很不喜欢很不喜欢KDE/Qt的版权,的版权,在

31、在GNOME项目发起后项目发起后RedHat立刻对其提供支持。立刻对其提供支持。v进入进入2000年之后,一系列重大事件接连发生,首先,年之后,一系列重大事件接连发生,首先,一批从苹果公司出来的工程师成立一批从苹果公司出来的工程师成立Eazel公司,为公司,为GNOME设计用户界面和设计用户界面和Nautilus(鹦鹉螺)文件管理(鹦鹉螺)文件管理器。同年器。同年8月,月,GNOME基金会在基金会在Sun、RedHat、Eazel、HelixCode(Ximian)的共同努力下正式成)的共同努力下正式成立,该基金会负责立,该基金会负责GNOME项目的开发管理以及提供资金。项目的开发管理以及提供

32、资金。此时,此时,GNOME获得许多重量级商业公司的支持,如惠普获得许多重量级商业公司的支持,如惠普公司采用公司采用GNOME作为作为HP-UX系统的用户环境,系统的用户环境,SUN则则宣布将宣布将StarOffice套件与套件与GNOME环境相整合,而环境相整合,而GNOME也将选择也将选择OpenOffice.org作为办公套件,作为办公套件,IBM公司则为公司则为GNOME共享了共享了SashXB极速开发环境。极速开发环境。同时,同时,GNOME基金会也决定采用基金会也决定采用Mozilla作为网页浏览作为网页浏览器。器。KDE阵营也毫不示弱,在当年阵营也毫不示弱,在当年10月份推出万众

33、瞩目月份推出万众瞩目的的KDE2.0。www.gec-edu.orgLinux下的桌面下的桌面GUIvKDE2.0拥有丰富的应用软件,实力明显超过拥有丰富的应用软件,实力明显超过GNOME。www.gec-edu.orgLinux下的桌面下的桌面GUIvKDE2.0堪称当时最庞大的自由软件,除了堪称当时最庞大的自由软件,除了KDE平台自身外,平台自身外,还包括还包括Koffice办公套件、办公套件、Kdevelop集成开发环境以及集成开发环境以及Konqueror网页浏览器。尽管这些软件都还比较粗糙,但网页浏览器。尽管这些软件都还比较粗糙,但KDE2.0已经很好实现了成立已经很好实现了成立KD

34、E项目时的目标。也是在这项目时的目标。也是在这个月,个月,TrollTech公司决定采用公司决定采用GPL公约来发行公约来发行Qt的免费版的免费版本,希望能够以此赢得开发者的支持。这样,本,希望能够以此赢得开发者的支持。这样,Qt实际上就拥有实际上就拥有双重授权:如果对应的双重授权:如果对应的Linux发行版采用免费非商业性的方式发行版采用免费非商业性的方式进行发放,那么使用进行发放,那么使用KDE无须向无须向TrollTech交纳授权费用;但交纳授权费用;但如果如果Linux发行版为盈利性的商业软件,那么使用发行版为盈利性的商业软件,那么使用KDE时必须时必须获得授权。由于获得授权。由于Tr

35、ollTech是商业公司且一直主导着是商业公司且一直主导着KDE的方的方向,双许可方式不失为解决开源与盈利矛盾的好办法。向,双许可方式不失为解决开源与盈利矛盾的好办法。TrollTech宣称,双许可制度彻底解决了宣称,双许可制度彻底解决了KDE在在GPL公约方公约方面的问题,但面的问题,但RedHat并不喜欢,并不喜欢,RedHat不断对不断对GNOME项目提供支持,希望它能够尽快走向成熟,除项目提供支持,希望它能够尽快走向成熟,除RedHat之外的之外的其他其他Linux厂商暂时都站在厂商暂时都站在KDE这一边,但他们同时也在发行这一边,但他们同时也在发行版中捆绑了版中捆绑了GNOME桌面。

36、桌面。www.gec-edu.orgLinux下的桌面下的桌面GUIvGTK库是库是GNOME项目的基础,它完全采用项目的基础,它完全采用GPL授权因此获得广泛支持。授权因此获得广泛支持。GNOME获得商业公司获得商业公司的支持的支持www.gec-edu.orgLinux下的桌面下的桌面GUIv进入进入2004年后,年后,KDE与与GNOME依然保持快速发展,依然保持快速发展,KDE阵营分别在阵营分别在2月份和月份和8月份推出月份推出3.2、3.3版本,版本,GNOME则在则在3月和月和9月推出月推出2.6和和2.8,两者的版本升,两者的版本升级步幅旗鼓相当。到级步幅旗鼓相当。到3.3版本的

37、版本的KDE已经非常成熟,它拥已经非常成熟,它拥有包括有包括KOffice、Konqueror浏览器、浏览器、Kmail套件、套件、KDE即时消息在内的一大堆应用软件,且多数都达到可即时消息在内的一大堆应用软件,且多数都达到可用标准,功能上完全不亚于用标准,功能上完全不亚于Windows2000。而。而GNOME更是在此期间高速发展,更是在此期间高速发展,GNOME2.8版本的版本的水准完全不逊于水准完全不逊于KDE3.3,而且此时两者的技术特点非,而且此时两者的技术特点非常鲜明:常鲜明:GNOME讲究简单、高效,运行速度比讲究简单、高效,运行速度比KDE更更快;快;KDE则拥有华丽的界面和丰

38、富的功能,使用习惯也与则拥有华丽的界面和丰富的功能,使用习惯也与微软微软Windows较类似。较类似。www.gec-edu.orgLinux下的桌面下的桌面GUIvKDE3.5可实现半透明和阴影效果,界面华丽、软件丰富。可实现半透明和阴影效果,界面华丽、软件丰富。www.gec-edu.orgLinux下的桌面下的桌面GUIv虽然在商业方面存在竞争,虽然在商业方面存在竞争,GNOME与与KDE两大阵营的两大阵营的开发者关系并没有变得更糟,相反他们都意识到支持对方开发者关系并没有变得更糟,相反他们都意识到支持对方的重要性。无论是的重要性。无论是GNOME的开发者还是的开发者还是KDE的开发者,

39、的开发者,他们都有着共同的目标,就是为他们都有着共同的目标,就是为Linux开发最好的图形环开发最好的图形环境,只是因为理念之差而分属不同的阵营。境,只是因为理念之差而分属不同的阵营。vKDE与与GNOME阵营大约从阵营大约从2003年开始逐渐相互支持对年开始逐渐相互支持对方的程序方的程序只要你在只要你在KDE环境中安装环境中安装GTK库,便可以运库,便可以运行行GNOME的程序,反之亦然。经过两年多的努力,的程序,反之亦然。经过两年多的努力,KDE和和GNOME都已经实现高度的互操作性,两大平台都已经实现高度的互操作性,两大平台的程序都是完全共享的,例如你可以在的程序都是完全共享的,例如你可

40、以在GNOME中运行中运行Konqueror浏览器、浏览器、Koffice套件,也可以在套件,也可以在KDE中运中运行行Evolution和和OpenOffice.org,只不过执行本地程,只不过执行本地程序的速度和视觉效果会好一些。序的速度和视觉效果会好一些。www.gec-edu.orgLinux下的桌面下的桌面GUIv开源社群的发展壮大为这些项目的未来发展奠定开源社群的发展壮大为这些项目的未来发展奠定了坚实的基础:了坚实的基础:vKDE项目将超越项目将超越Windows作为自己的目标作为自己的目标vGNOME项目更是将开发目标定在超越项目更是将开发目标定在超越MacOSX的的Aqua图形

41、环境;图形环境;www.gec-edu.orgLinux下的桌面下的桌面GUIKDEgnomewww.gec-edu.org嵌入式嵌入式GUI在嵌入式系统中,在嵌入式系统中,GUI的地位也越来越重要,的地位也越来越重要,但是不同于桌面机系统,嵌入式但是不同于桌面机系统,嵌入式GUI要求简单、要求简单、直观、可靠、占用资源小且反应快速,以适应系直观、可靠、占用资源小且反应快速,以适应系统硬件资源有限的条件。另外,由于嵌入式系统统硬件资源有限的条件。另外,由于嵌入式系统硬件本身的特殊性,嵌入式硬件本身的特殊性,嵌入式GUI应具备高度可移应具备高度可移植性与可裁减性,以适应不同的硬件条件和使用植性与

42、可裁减性,以适应不同的硬件条件和使用需求。总体来讲,嵌入式需求。总体来讲,嵌入式GUI具备以下特点:具备以下特点:v体积小;体积小;v运行时耗用系统资源小;运行时耗用系统资源小;v上层接口与硬件无关,高度可移植;上层接口与硬件无关,高度可移植;v高可靠性;高可靠性;v在某些应用场合应具备实时性。在某些应用场合应具备实时性。www.gec-edu.org嵌入式嵌入式GUIUNIX环境下的图形视窗标准为环境下的图形视窗标准为XWindowSystem,Linux是类是类UNIX系统,所以顶层运行的系统,所以顶层运行的GUI系统是兼容系统是兼容X标准的标准的XFree86系统。好处是具系统。好处是具

43、有可扩展性、可移植性等优点,但对于嵌入式系统而有可扩展性、可移植性等优点,但对于嵌入式系统而言无疑太过庞大、累赘、低效。目前流行的嵌入式言无疑太过庞大、累赘、低效。目前流行的嵌入式GUI与与X思路不同,这些思路不同,这些GUI一般不局限于一般不局限于X标准,标准,更强调系统的空间和效率。更强调系统的空间和效率。www.gec-edu.org嵌入式嵌入式GUIvFrameBuffer是出现在是出现在2.2.xx内核当中的一内核当中的一种驱动程序接口,在种驱动程序接口,在2.4以后的内核中盛行该用以后的内核中盛行该用法,尤其是法,尤其是2.6内核的嵌入式设备中。内核的嵌入式设备中。vFrameBu

44、ffer是是Linux控制台下的一个通用的控制台下的一个通用的图形接口,它拥有良好的平台无关性,可以支持图形接口,它拥有良好的平台无关性,可以支持绝大多数的硬件,因而得到愈来愈多厂家的支持,绝大多数的硬件,因而得到愈来愈多厂家的支持,一些流行的图形库如一些流行的图形库如QT、GTK便是基于便是基于FrameBuffer的。它的接口非常简单,通过它的。它的接口非常简单,通过它可以十分方便地构建一个图形系统,特别适合嵌可以十分方便地构建一个图形系统,特别适合嵌入式设备。入式设备。www.gec-edu.org嵌入式嵌入式GUIvLinux是工作在保护模式下,所以用户态进程是无法像是工作在保护模式下

45、,所以用户态进程是无法像DOS那样使用显卡那样使用显卡BIOS里提供的中断调用来实现直接写屏,里提供的中断调用来实现直接写屏,Linux抽象出抽象出FrameBuffer这个设备来供用户态进程实现直这个设备来供用户态进程实现直接写屏。接写屏。Framebuffer机制模仿显卡的功能,将显卡硬件结机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过构抽象掉,可以通过Framebuffer的读写直接对显存进行操的读写直接对显存进行操作。用户可以将作。用户可以将Framebuffer看成是显示内存的一个映像,看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而将其映射到进程

46、地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节,这些用户不必关心物理显存的位置、换页机制等等具体细节,这些都是由都是由Framebuffer设备驱动来完成的。但设备驱动来完成的。但Framebuffer本身不具备任何运算数据的能力本身不具备任何运算数据的能力,就只好比是一个暂时存放水的就只好比是一个暂时存放水的水池水池.CPU将运算后的结果放到这个水池将运算后的结果放到这个水池,水池再将结果流到显水池再将结果流到显示器示器.中间不会对数据做处理中

47、间不会对数据做处理.应用程序也可以直接读写这个水应用程序也可以直接读写这个水池的内容池的内容.www.gec-edu.org嵌入式嵌入式GUIv目前在嵌入式系统比较流行的图形用户界面目前在嵌入式系统比较流行的图形用户界面GUI:Qt/EmbeddedMiniGUIwww.gec-edu.orgLinux下的桌面下的桌面GUI2008年1月诺基亚为加强软件研发实力,斥资1.53亿美元收购了软件研发企业Trolltech,QT成为诺基亚旗下的主力GUI平台。主页:http:/ www.gec-edu.org代码详细分析代码详细分析v#includev这一行包含了这一行包含了QPushButton类

48、的定义。参考文档的文件的最上部类的定义。参考文档的文件的最上部分提到了使用哪个类就必须包含哪个头文件的说明。分提到了使用哪个类就必须包含哪个头文件的说明。vQPushButton是一个经典的图形用户界面按钮,用户可以按下是一个经典的图形用户界面按钮,用户可以按下去,也可以放开。它管理自己的观感,就像其它每一个去,也可以放开。它管理自己的观感,就像其它每一个QWidget。一个窗口部件就是一个可以处理用户输入和绘制图形的用户界面对象。一个窗口部件就是一个可以处理用户输入和绘制图形的用户界面对象。程序员可以改变它的全部观感和它的许多主要的属性(比如颜色),程序员可以改变它的全部观感和它的许多主要的

49、属性(比如颜色),还有这个窗口部件的内容。一个还有这个窗口部件的内容。一个QPushButton可以显示一段文本可以显示一段文本或者一个或者一个QPixmap。www.gec-edu.org代码详细分析代码详细分析vintmain(intargc,char*argv)vmain()函数是程序的入口。几乎在使用函数是程序的入口。几乎在使用Qt的所有情况下,的所有情况下,main()只需要只需要在把控制转交给在把控制转交给Qt库之前执行一些初始化,然后库之前执行一些初始化,然后Qt库通过事件来向程序告知库通过事件来向程序告知诉用户的行为。诉用户的行为。vargc是命令行变量的数量,是命令行变量的数

50、量,argv是命令行变量的数组。这是一个是命令行变量的数组。这是一个C/C+特征。它不是特征。它不是Qt专有的,无论如何专有的,无论如何Qt需要处理这些变量(请看下面)。需要处理这些变量(请看下面)。vQApplicationapp(argc,argv);va是这个程序的是这个程序的QApplication。它在这里被创建并且处理这些命令行变量。它在这里被创建并且处理这些命令行变量在任何在任何Qt的窗口系统部件被使用之前创建的窗口系统部件被使用之前创建QApplication对象是必须的。对象是必须的。www.gec-edu.org代码详细分析代码详细分析v在在QApplication之后,接

51、着的是第一个窗口系统代码:之后,接着的是第一个窗口系统代码:创建一个按钮。创建一个按钮。vQPushButtonhello(Helloworld!,0);v或者或者vQPushButton*hello=newQPushButton(Helloworld!,0);v这个按钮被设置成显示这个按钮被设置成显示“Helloworld!”并且它自己构成并且它自己构成了一个窗口。如果组件本身可以作为主窗口,则无需设置了一个窗口。如果组件本身可以作为主窗口,则无需设置主窗口。在本例中,下压按钮创建时其构造函数中的第二主窗口。在本例中,下压按钮创建时其构造函数中的第二个参数为个参数为0,表示按钮无父窗体,所在

52、窗口即为主窗口,表示按钮无父窗体,所在窗口即为主窗口,不需要设置主窗口。不需要设置主窗口。www.gec-edu.org代码详细分析代码详细分析v如果想设置该按钮的大小可以使用以下方法:如果想设置该按钮的大小可以使用以下方法:vhello-resize(100,30);v这个按键被设置成这个按键被设置成100像素宽,像素宽,30像素高(加上窗口系像素高(加上窗口系统边框)。在这种情况下,我们不用考虑按钮的位置,并统边框)。在这种情况下,我们不用考虑按钮的位置,并且我们接受默认值。且我们接受默认值。如果需要设置控件的位置与大小,如果需要设置控件的位置与大小,可以用以下方法(按钮控件为主窗体时无效

53、,即父窗体不可以用以下方法(按钮控件为主窗体时无效,即父窗体不能为能为0时生效):时生效):vhello-setGeometry(QRect(40,40,100,30);www.gec-edu.org代码详细分析代码详细分析vapp.setMainWidget(hello);v这个按钮被选为这个应用程序的主窗口部件。如果用户关闭了主窗口部件,应这个按钮被选为这个应用程序的主窗口部件。如果用户关闭了主窗口部件,应用程序就退出了。用程序就退出了。vhello-show();v当创建一个窗口部件的时候,它是不可见的。你必须调用当创建一个窗口部件的时候,它是不可见的。你必须调用show()来使它变为来

54、使它变为可见的。可见的。vreturnapp.exec();v这里就是这里就是main()把控制转交给把控制转交给Qt,并且当应用程序退出的时候,并且当应用程序退出的时候exec()就会就会返回。返回。在在exec()中,中,Qt接受并处理用户和系统的事件并且把它们传递给适当接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。的窗口部件。www.gec-edu.orgQtDesignerQt应用程序除了使用手工编写代码的方式外,应用程序除了使用手工编写代码的方式外,还可以用还可以用Qt集成开发环境中的集成开发环境中的Desinger设计器设计器来完成,来完成,QtDesigner的功能十

55、分强大,界面类的功能十分强大,界面类似于我们常用的似于我们常用的VB,而且还提供了大量可供编程,而且还提供了大量可供编程使用的组件使用的组件www.gec-edu.orgDesigner快速创建快速创建Qt工程工程v安装完整版的安装完整版的RedHatEnterpriseLinux,系统将附带安装此工具系统将附带安装此工具.可以点击应用程序编程可以点击应用程序编程QtDesigner来找到它或者在终来找到它或者在终端输入:端输入:designer启动启动www.gec-edu.orgvQtDesigner首先呈现给用户的是一个首先呈现给用户的是一个New/Open对话对话框。因为这里要创建一个

56、框。因为这里要创建一个C+程序,所以在此选择程序,所以在此选择C+Project,点击,点击“OK”继续。继续。Designer快速创建快速创建Qt工程工程www.gec-edu.orgv选择一个想要保存文件的位置,并且给出一个文件名,文选择一个想要保存文件的位置,并且给出一个文件名,文件名的扩展名选择件名的扩展名选择.pro。点击。点击“OK”后后,见到如下界面见到如下界面Designer快速创建快速创建Qt工程工程www.gec-edu.orgv如下是如下是QtDesigner主窗口,确保主窗口,确保PropertyEditor可可见。如果不可见的,用户可以通过见。如果不可见的,用户可以通

57、过WindowsViewsPropertyEditor/SignalHandlers选单选项来使其可见选单选项来使其可见Designer快速创建快速创建Qt工程工程www.gec-edu.orgDesigner快速创建快速创建Qt工程工程v通过菜单栏,选择通过菜单栏,选择FileNewDialog,输入工程,输入工程名及路径后,点击名及路径后,点击“OK”创建一个对话框窗体,此时该窗创建一个对话框窗体,此时该窗体的内容是空的,且标题栏和控件名均默认为体的内容是空的,且标题栏和控件名均默认为“Form1”。v接下来通过鼠标拖曳窗体的边缘,将船体调整到想要的大接下来通过鼠标拖曳窗体的边缘,将船体调

58、整到想要的大小,再选取工具栏(小,再选取工具栏(Toolbox)CommonWidgetsPushButton,在窗体上画一个按钮控件,在窗体上画一个按钮控件并双击这个按钮将其显示文本改为并双击这个按钮将其显示文本改为“HelloWorld”。v点击快捷按钮点击快捷按钮Save进行保存,此时创建了一个新的窗体进行保存,此时创建了一个新的窗体如下图如下图所示。所示。www.gec-edu.orgDesigner快速创建快速创建Qt工程工程www.gec-edu.orgDesigner快速创建快速创建Qt工程工程v现在已经基本完成这个简单工程现在已经基本完成这个简单工程UI界面建立的步骤。在编译此

59、应用程界面建立的步骤。在编译此应用程序之前,需要创建一个序之前,需要创建一个main.cpp文件。文件。v方法是选择方法是选择FileNewC+Main-File(main.cpp),只需接受,只需接受缺省的配置即可。缺省的配置即可。main.cpp会自动在会自动在CodeEditor中打开。无需中打开。无需改变改变main.cpp中的任何内容,保持默认,并且保存中的任何内容,保持默认,并且保存main.cpp。v到此为止,在到此为止,在QtDesigner中创建工程的工作已经全部完成。保存中创建工程的工作已经全部完成。保存整个项目,下面来编译和运行这个程序。在编译程序之前,要首先生整个项目,

60、下面来编译和运行这个程序。在编译程序之前,要首先生成它的成它的Makefile文件。打开终端,然后切换至该项目的目录下,使文件。打开终端,然后切换至该项目的目录下,使用以下命令来生成用以下命令来生成Makefile文件:文件:v#qmakewww.gec-edu.orgv接下来执行接下来执行make命令来编译程序。命令来编译程序。v当编译工作完成后,输入当编译工作完成后,输入./hello来运行程序。来运行程序。v如果一切正常,可以看到以下界面如果一切正常,可以看到以下界面Designer快速创建快速创建Qt工程工程www.gec-edu.orgDesigner生成文件分析生成文件分析v通过通

61、过Designer设计器设计设计器设计QT工程工程v首先我们创建了首先我们创建了pro工程文件,设计出工程文件,设计出UI文件文件v然后通过然后通过qmake工具自动生成工具自动生成Makefile工程管理文件,在工程管理文件,在Makefile中设置通过使中设置通过使用元对象工具用元对象工具UIC和和MOC将工程中的将工程中的UI文文件转译成对应的件转译成对应的.cpp、.h文件和文件和moc文件文件(信号、槽的实现)(信号、槽的实现)www.gec-edu.orgDesigner生成文件分析生成文件分析vHello.pro文件分析文件分析vTEMPLATE=app#QT模板为模板为appv

62、LANGUAGE=C+#工程文件路径为当前目录工程文件路径为当前目录vCONFIG+=qtwarn_onreleasev#CONFIG的配置模块的配置模块,一般采用默认即可一般采用默认即可v#QT运行系统环境设置运行系统环境设置vunix#Unix系统环境则执行以下内容系统环境则执行以下内容vUI_DIR=.ui#Ui文件的存放目录文件的存放目录vMOC_DIR=.moc#Moc文件的存放目录文件的存放目录vOBJECTS_DIR=.obj#工程目标工程目标.o文件的存放目录文件的存放目录vvSOURCES+=main.cpp#工程文件源码包含工程文件源码包含main.cppvFORMS=fo

63、rm1.ui#工程工程UI文件包含文件包含form1.uiwww.gec-edu.orgDesigner生成文件分析生成文件分析vmain.cpp文件内容如下:文件内容如下:v#include/包含包含QT窗口类的头文件窗口类的头文件qapplication.hv#includeform1.h/包含窗口包含窗口1的类原型声明头文件的类原型声明头文件form1.hvintmain(intargc,char*argv)/主函数入口主函数入口vvQApplicationa(argc,argv);/创建创建QApplication对象对象a,对窗口程序进行管理,对窗口程序进行管理vForm1w;/创建

64、窗口创建窗口1的对象的对象wvw.show();/调用对象调用对象w的父类成员方法的父类成员方法show()进行窗口显示进行窗口显示v/下面使用下面使用connect方法将对象方法将对象a的最后一个窗口的关闭信号与系统槽函数的最后一个窗口的关闭信号与系统槽函数quit()进行连接进行连接vva.connect(&a,SIGNAL(lastWindowClosed(),&a,SLOT(quit();vreturna.exec();/调用对象调用对象a的的exec()方法进行窗口执行与切换()方法进行窗口执行与切换vwww.gec-edu.orgDesigner生成文件分析生成文件分析v通过通过u

65、ic工具自动转译成的工具自动转译成的form1.h头文件内容如下:头文件内容如下:v#ifndefFORM1_H/文件标识宏文件标识宏v#defineFORM1_Hv/包含包含QT相关头文件相关头文件v#includev#includev/被引用的类体的前置声明被引用的类体的前置声明vclassQVBoxLayout;vclassQHBoxLayout;vclassQGridLayout;vclassQSpacerItem;vclassQPushButton;v/类类Form1的原型声明,从的原型声明,从QDialog父类公有继承父类公有继承vclassForm1:publicQDialogv

66、vQ_OBJECT/声明声明Q_OBJECT宏,支持信号槽机制宏,支持信号槽机制www.gec-edu.orgDesigner生成文件分析生成文件分析v/公有成员方法公有成员方法vpublic:v/构造函数构造函数vForm1(QWidget*parent=0,constchar*name=0,boolmodal=FALSE,WFlagsfl=0);v/析构函数析构函数vForm1();v/定义一个定义一个QPushButton类型的按钮对象类型的按钮对象vQPushButton*pushButton1;vprotected:vprotectedslots:/受保护的槽函数受保护的槽函数vvi

67、rtualvoidlanguageChange();v/用于显示文本信息的虚函数,实现多态继承用于显示文本信息的虚函数,实现多态继承v;v#endif/FORM1_H/文件标识宏文件标识宏www.gec-edu.orgDesigner生成文件分析生成文件分析vForm1.cpp文件内容如下:文件内容如下:v#includeform1.h/包含类包含类form1的原型声明的头文件的原型声明的头文件v/包含各引用类的原型声明的头文件包含各引用类的原型声明的头文件v#includev#includev#includev#includev#includev#includev#includev/Form

68、1的构造函数的构造函数vForm1:Form1(QWidget*parent,constchar*name,boolmodal,WFlagsfl)v:QDialog(parent,name,modal,fl)vvif(!name)/如若窗口未定义名称如若窗口未定义名称vsetName(Form1);/设置默认窗体名称为设置默认窗体名称为“Form1”www.gec-edu.orgDesigner生成文件分析生成文件分析vpushButton1=newQPushButton(this,pushButton1);v/实例化一个新的按钮实例化一个新的按钮vpushButton1-setGeometr

69、y(QRect(70,60,211,61);v/设置该按钮的位置属性设置该按钮的位置属性vlanguageChange();/显示控件上的文本信息显示控件上的文本信息vresize(QSize(354,199).expandedTo(minimumSizeHint();v/设置窗口显示属性,从设置窗口显示属性,从QSize(354,199)和和minimumSizeHint()(返(返回一个回一个QSize对象)中取两者之中的最大宽度和最大高度组成一个新的对象)中取两者之中的最大宽度和最大高度组成一个新的QSize对象。对象。vclearWState(WState_Polished);v/常见

70、于用常见于用Designer生成的代码中。由于生成的代码中。由于WState_Polished是一个内部标是一个内部标志,在用户的代码中一般不要使用它。志,在用户的代码中一般不要使用它。vvForm1:Form1()/析构函数析构函数vv/noneedtodeletechildwidgets,QtdoesitallforusvvvoidForm1:languageChange()/显示空间文本信息显示空间文本信息vvsetCaption(tr(Form1);vpushButton1-setText(tr(HelloWorld);v/在按键上显示在按键上显示HelloWorldvwww.gec-

71、edu.orgQT的信号与的信号与槽槽v在在GUI用户界面中,当用户操作一个控件时,需用户界面中,当用户操作一个控件时,需要其它控件的响应或能够激活其他的操作。要其它控件的响应或能够激活其他的操作。QT中中提供了信号与提供了信号与槽机制。槽机制。v信号是一个特定标识;一个槽就是一个函数,信号是一个特定标识;一个槽就是一个函数,v槽函数与一般的函数不同,槽函数和信号关联,槽函数与一般的函数不同,槽函数和信号关联,也可像普通函数那样调用。当某一个事件出现时,也可像普通函数那样调用。当某一个事件出现时,通过发送信号,可以将与其关联的槽函数激活,通过发送信号,可以将与其关联的槽函数激活,即执行槽函数代

72、码。即执行槽函数代码。www.gec-edu.org信号和槽的声明信号和槽的声明v信号与槽的声明也是在头文件中进行的。信号与槽的声明也是在头文件中进行的。(例例qt1)v例如,下面声明了三个信号例如,下面声明了三个信号signals: void mysignals(); void mysignals(int x); void mysignals(int x,int y);v例如,下面声明了三个槽:例如,下面声明了三个槽:vpublicslots:v void mySlot(); v void mySlot(int x); v void mySignalParam(int x,int y); w

73、ww.gec-edu.orgSignal和和Slot的声明(一)的声明(一)在在Qt程序设计中,凡是包含程序设计中,凡是包含signal和和slot的类中都要加的类中都要加上上Q_OBJECT的定义,下面的例子给出了如何在一个类的定义,下面的例子给出了如何在一个类中定义中定义signal和和slot:class Student : public QObject Q_OBJECTpublic: Student() myMark = 0; int mark() const return myMark; public slots: void setMark(int newMark);signals:

74、 void markChanged(int newMark);private: int myMark;www.gec-edu.orgSignal和和Slot的声明(二)的声明(二)signal的发出一般在事件的处理函数中,利的发出一般在事件的处理函数中,利用用emit发出发出signal,在下面的例子中在在事件,在下面的例子中在在事件处理结束后发出处理结束后发出signalvoid Student:setMark(int newMark) if (newMark!= myMark) do something.www.gec-edu.orgSignal和和Slot的连接(一)的连接(一)在在si

75、gnal和和slot声明以后,需要使用声明以后,需要使用connect()函数将它们连接起来。函数将它们连接起来。connect()函数属于函数属于QObject类的成员函数,它能够连接类的成员函数,它能够连接signal和和slot,也可以用来连接,也可以用来连接signal和和signal函数原形如下:函数原形如下:bool QObject:connect(const QObject*, const char*, const QObject*, const char*)其中第一个和第三个参数分别指出其中第一个和第三个参数分别指出signal和和slot是属于那个对象或组件是属于那个对象或组

76、件 www.gec-edu.orgSignal和和Slot的连接(二)的连接(二)在使用在使用connect()函数进行来接的时候,还函数进行来接的时候,还需要用到需要用到SIGNAL()和和SLOT()这两个宏,使用这两个宏,使用方法如下方法如下(例(例qt2)QLabel *label = new QLabel; QScrollBar *scroll = new QScrollBar;QObject:connect( scroll,SIGNAL(valueChanged(int), label, SLOT(setNum(int) );www.gec-edu.orgSignal和和Slot的

77、连接方式(一)的连接方式(一)www.gec-edu.orgSignal和和Slot的连接方式(二)的连接方式(二)v同一个信号连接多个插槽同一个信号连接多个插槽connect(slider, SIGNAL(valueChanged(int),spinBox, SLOT(setValue(int);connect(slider,SIGNAL(valueChanged(int),this,SLOT(updateStatusBarIndicator(int);v多个信号连接到同一个插槽多个信号连接到同一个插槽connect(lcd, SIGNAL(overflow(),this, SLOT(han

78、dleMathError();connect(calculator, SIGNAL(divisionByZero(),this, SLOT(handleMathError();www.gec-edu.orgSignal和和Slot的连接方式(三)的连接方式(三)v一个信号连接到另一个信号一个信号连接到另一个信号connect(lineEdit, SIGNAL(textChanged(const QString &), this, SIGNAL(updateRecord(const QString &);v取消一个连接取消一个连接disconnect(lcd,SIGNAL(overflow(),

79、this,SLOT(handleMathError();v取消一个连接不是很常用,因为取消一个连接不是很常用,因为Qt会在一个对象会在一个对象被删除后自动取消这个对象所包含的所有的连接被删除后自动取消这个对象所包含的所有的连接www.gec-edu.org信号和槽的实现信号和槽的实现v用来处理对象间通信的信号用来处理对象间通信的信号/槽机制、运行时的类槽机制、运行时的类型信息和动态属性系统是型信息和动态属性系统是Qt元对象系统,它基于元对象系统,它基于QObject类、类声明中的私有段中的类、类声明中的私有段中的vQ_OBJECT宏和元对象编译器宏和元对象编译器(MOC)。vMOC读取读取C+

80、源文件,如果发现类的声明中含源文件,如果发现类的声明中含有有Q_OBJECT宏,则为含有宏,则为含有Q_OBJECT宏的类宏的类生成另一个含有元对象代码的源文件,这个生成生成另一个含有元对象代码的源文件,这个生成的元对象代码文件可以把类的源文件和这个类的的元对象代码文件可以把类的源文件和这个类的实现一起编译连接。实现一起编译连接。www.gec-edu.orgSignal小结小结v如果有多个槽与一个信号相连接,则这些槽将被如果有多个槽与一个信号相连接,则这些槽将被一个接一个地执行,且其执行顺序是随意的。一个接一个地执行,且其执行顺序是随意的。v信号是由信号是由MOC自动生成的,必须在自动生成的

81、,必须在.cpp文件中文件中实现,而且永远没有返实现,而且永远没有返回值。回值。www.gec-edu.orgSlot的小结的小结v槽是普通成员函数,它和普通成员函数一样分为槽是普通成员函数,它和普通成员函数一样分为public、protected和和private共共3类。类。vpublicslot:任何信号都可以与之相连接。这在窗口部件任何信号都可以与之相连接。这在窗口部件编程中非常有用,用于创建一些对彼此一无所知的对象,编程中非常有用,用于创建一些对彼此一无所知的对象,只有通过信号和槽来交换信息。只有通过信号和槽来交换信息。vprotectedslot:只有该类及其子类所派生的对象的信号

82、只有该类及其子类所派生的对象的信号才可以与之相连才可以与之相连v接。这类槽的目的通常是为了类的完善,而不是类与外界接。这类槽的目的通常是为了类的完善,而不是类与外界的接口。的接口。vprivateslot:只有该类自己的信号才可以与之相连接。只有该类自己的信号才可以与之相连接。v当然还可以将定义为当然还可以将定义为virtual,这将非常有用。,这将非常有用。www.gec-edu.orgv练习练习如下图界面上有一个如下图界面上有一个label,两两pushbutton。当点击一个当点击一个pushbutton时时,Label显示字符显示字符1点击另一个点击另一个pushbutton时时,la

83、bel显示字符显示字符2www.gec-edu.org使用使用Designer创建信号与槽创建信号与槽v首先我们新建一个文件夹首先我们新建一个文件夹:v#mkdir/root/qt/signalv我们创建新的我们创建新的Qt项目项目,项目路径为项目路径为/root/qt/signal/signal.prov从菜单栏的从菜单栏的File-New打开新建对话框,选择第二个:打开新建对话框,选择第二个:Dialogv在在QTDesigner中出现一个新窗体中出现一个新窗体From1.通过右侧的控件属性通过右侧的控件属性栏更改窗口的栏更改窗口的name为为MainFrom,把,把caption的值改为

84、的值改为signal。v然后我们从左面的然后我们从左面的Toolbox拖拽一个拖拽一个PushButton.并把并把name改改为为ExitButton,把把text改为改为Exit。www.gec-edu.orgv效果图效果图:使用使用Designer创建信号与槽创建信号与槽www.gec-edu.org使用使用Designer创建信号与槽创建信号与槽v下面我们为下面我们为ExitButton设置信号函数设置信号函数.v我们按一下我们按一下F3(或者有菜单栏选择(或者有菜单栏选择vEdit-Connections),然後在那个然後在那个“Exit”按钮上按钮上点击一下。点击一下。v这时侯我们

85、就看到了这时侯我们就看到了ViewandEditConnection页页面了面了.在在Sender中选中新添的按钮控件,在中选中新添的按钮控件,在Signal中选中选择择clicked,在在Reciever中选择中选择MainFrom.在在slot中中,先选择先选择close(),最后选择最后选择OK.www.gec-edu.org使用使用Designer创建信号与槽创建信号与槽www.gec-edu.org使用使用Designer创建信号与槽创建信号与槽v信号与槽基本创建完成,保存。信号与槽基本创建完成,保存。查看程序图形结果可以用查看程序图形结果可以用CTRL+T来看来看PreView.v

86、保存保存UI文件到创建的工程文件目录中。文件到创建的工程文件目录中。v菜单栏的菜单栏的File-New打开新建对话框,选择最后一个:打开新建对话框,选择最后一个:C+MainFile(main.cpp),创建,创建main.cpp文件,并保存。文件,并保存。v打开终端,切换到建立工程的目录。然后利用打开终端,切换到建立工程的目录。然后利用Qt的的qmake工具生成工具生成Makefile文件。文件。v#qmakev编译:编译:v#makev运行:运行:v#./signalv点击点击Exit按扭,程序退出。按扭,程序退出。www.gec-edu.orgQtDesigner中槽应用实例中槽应用实例

87、v目标:制作一个加法计算器,实现整数的加运算。目标:制作一个加法计算器,实现整数的加运算。v步骤:步骤:v1.打开打开Qt,新建名为新建名为slot的工程文件,然后再新建如下图的工程文件,然后再新建如下图所示的界面:所示的界面:www.gec-edu.orgQtDesigner中槽应用实例中槽应用实例v修改要显示结果的修改要显示结果的label的的name为为textLableresult.并把其并把其text清清空空.把确定按扭的把确定按扭的name改为改为AddButton.v把页面设置好,当用户按下把页面设置好,当用户按下AddButton按扭时按扭时textLableresult能能够

88、显示够显示lineEdit1和和lineEdit2中显示数字的和中显示数字的和.因此必须对因此必须对AddButton的的clock信号设置一个槽信号设置一个槽.v首先按一下首先按一下F3(或者有菜单栏选择(或者有菜单栏选择Edit-Connections),然后然后在在AddButton按钮上点击一下这时侯将看到按钮上点击一下这时侯将看到“ViewandEditConnection”的页面。在的页面。在Signal中选择中选择clicked,在在Receiver中选中选择择MainForm.在在Slot中中,都是都是QT的默认槽,我们需要建立自己的槽的默认槽,我们需要建立自己的槽.www.g

89、ec-edu.orgv点击右边的点击右边的“EditSlots.”按钮,可看见按钮,可看见EditFunctions窗口窗口,该窗口也可以通过该窗口也可以通过“主菜单主菜单Edit-Slots”打开。点击打开。点击NewFunction按钮,将按钮,将newSlot()改为改为add(),然后选择然后选择OK。v这时已经建立了一个槽这时已经建立了一个槽,再回到再回到ViewandEditConnection对对话框中,在话框中,在Slot中现在可以看到刚刚创建的槽中现在可以看到刚刚创建的槽add(),选择它选择它.这这样就可以使样就可以使AddButton的信号与的信号与add()槽关联起来了

90、。槽关联起来了。QtDesigner中槽应用实例中槽应用实例www.gec-edu.orgv接下来还需要向接下来还需要向add()槽里写一些代码槽里写一些代码,使它能够完成加使它能够完成加法功能法功能.在主窗体在主窗体form_main的空白处双击鼠标左的空白处双击鼠标左键,弹出对话框键,弹出对话框Creatingui.hfile,我们选择我们选择Yes,然后可以看到一个编辑窗口。如下图所示:然后可以看到一个编辑窗口。如下图所示:QtDesigner中槽应用实例中槽应用实例www.gec-edu.orgQtDesigner中槽应用实例中槽应用实例voidMainForm:add()QStrin

91、gstr1,str2,strResult;doubleadd1=0.0,add2=0.0,result=0.0;str1=lineEdit1-text();str2=lineEdit2-text();boolok1=FALSE,ok2=FALSE;add1=str1.toDouble(&ok1);add2=str2.toDouble(&ok2);if(ok1&ok2)result=add1+add2;strResult.sprintf(%f,result);textLableresult-setText(strResult);www.gec-edu.orgv至此编辑的工作全部结束,保存。然后打

92、开一个终端,改变当前目录为保存项至此编辑的工作全部结束,保存。然后打开一个终端,改变当前目录为保存项目的目录,然后生成目的目录,然后生成Makefile文件:文件:v#qmakev编译:编译:v#makev运行:运行:#v./slotQtDesigner中槽应用实例中槽应用实例www.gec-edu.orgQT小结小结信号与槽信号与槽FAQ:v元对象编译工具元对象编译工具mocv问题:信号与槽机制独立于标准的问题:信号与槽机制独立于标准的C/C+语言,但编译语言,但编译QT程序实程序实际上仍然使用的是标准际上仍然使用的是标准C/C+的编译器,那标准的编译器,那标准C/C+的编译的编译器究竟是如

93、何编译含有信号与槽的器究竟是如何编译含有信号与槽的QT程序的呢?程序的呢?v答案:在编译含有信号与槽的答案:在编译含有信号与槽的QT程序时,借助了一个称为程序时,借助了一个称为moc(MetaObjectCompiler)的)的QT工具,该工具是一个工具,该工具是一个C/C+预处理程序,它为高层次的事件处理自动生成所需要的附预处理程序,它为高层次的事件处理自动生成所需要的附加代码。有了这些附加代码标准加代码。有了这些附加代码标准C/C+的编译器才能编译含有独的编译器才能编译含有独立于标准的立于标准的C/C+语言的信号与槽的语言的信号与槽的QT程序。程序。v信号与槽的适用范围信号与槽的适用范围v

94、问题:信号与槽是不是在问题:信号与槽是不是在QT中随处可用?中随处可用?v答案:并不是这样的,只有从答案:并不是这样的,只有从QObject或其子类或其子类(例如例如Qwidget)派生的类才包含信号和槽,另一方面所有从派生的类才包含信号和槽,另一方面所有从QObject或其子类派生或其子类派生的类都能够包含信号和槽。的类都能够包含信号和槽。www.gec-edu.orgQT小结小结v信号与槽的非常规连接信号与槽的非常规连接v问题:信号可否连接普通的成员函数?出来槽函数信号就不能与其问题:信号可否连接普通的成员函数?出来槽函数信号就不能与其他函数连接了吗?他函数连接了吗?v答案:信号不可以连接

95、普通的成员函数,但信号可以与信号连接。答案:信号不可以连接普通的成员函数,但信号可以与信号连接。当发送者的信号发射,与之相连的接收者的信号也会被发射,反之当发送者的信号发射,与之相连的接收者的信号也会被发射,反之不然。不然。v信号的参数信号的参数v问题:信号既然是成员函数,那么信号可否带参数?问题:信号既然是成员函数,那么信号可否带参数?v答案:信号是可以带参数的,当带参数的信号与带有相同类型参数答案:信号是可以带参数的,当带参数的信号与带有相同类型参数的槽连接,发射这个信号,与之相连的槽函数被调用的同时参数的的槽连接,发射这个信号,与之相连的槽函数被调用的同时参数的值也会由信号传至槽。但建议

96、尽量少的去使用信号与槽机制传递参值也会由信号传至槽。但建议尽量少的去使用信号与槽机制传递参数,因为信号参数与槽各自所带参数的类型和数量不同等情形可能数,因为信号参数与槽各自所带参数的类型和数量不同等情形可能导致程序出现不可预知的错误。导致程序出现不可预知的错误。v问题:信号可以连接多个槽吗?问题:信号可以连接多个槽吗?v答案:信号是可以连接多个槽的。但当信号被发射时,这些被同一答案:信号是可以连接多个槽的。但当信号被发射时,这些被同一个信号连接的槽函数的调用顺序是随机的。个信号连接的槽函数的调用顺序是随机的。www.gec-edu.orgQT小结小结v信号的返回值信号的返回值v问题:信号既然是

97、成员函数,那么信号可否有返回值?问题:信号既然是成员函数,那么信号可否有返回值?v答案:信号也可以有返回值,但其返回值无任何意义。答案:信号也可以有返回值,但其返回值无任何意义。另外,信号会在相连的所有槽函数全部返回后返回。另外,信号会在相连的所有槽函数全部返回后返回。v槽的权限类型槽的权限类型v问题:既然槽的声明中必须要有权限类型的声明,那么问题:既然槽的声明中必须要有权限类型的声明,那么不同存取权限(不同存取权限(private、protected或或public)的)的槽使用起来有什么区别?槽使用起来有什么区别?v答案:区别自然是有的。答案:区别自然是有的。publicslots:声明为

98、:声明为public类型的槽,任何对象都可将信号与之相连接。类型的槽,任何对象都可将信号与之相连接。protectedslots:声明为:声明为protected类型的槽,当类型的槽,当前类及其子类的对象可以将信号与之相连接。前类及其子类的对象可以将信号与之相连接。privateslots:声明为:声明为private类型的槽,只有类自己的对象可类型的槽,只有类自己的对象可以将信号与之相连接。以将信号与之相连接。www.gec-edu.org发散与提高发散与提高v利用利用QT中的类和方法,通过中的类和方法,通过QT的信号与槽制作一个软键盘程序的信号与槽制作一个软键盘程序virtualKeyBo

99、ard,实现与硬键盘输入相同的功能和效果。,实现与硬键盘输入相同的功能和效果。v实现思路实现思路v在编辑代码之前,我们先思考一下我们如何实现这个软键盘,然后在编辑代码之前,我们先思考一下我们如何实现这个软键盘,然后分析它的实现过程和步骤。分析它的实现过程和步骤。v(1)画界面)画界面v我们的程序既然要软键盘,就必不可少的需要多个按钮来模仿我们我们的程序既然要软键盘,就必不可少的需要多个按钮来模仿我们的键盘。我们先来模拟最简单的数字键盘,即在窗体中摆放从的键盘。我们先来模拟最简单的数字键盘,即在窗体中摆放从0到到9的的10个数字键。接下来我们还在窗体中摆放两个行文本编辑框个数字键。接下来我们还在

100、窗体中摆放两个行文本编辑框QLineEdit,以检验该软键盘能否向不同的控件输入。,以检验该软键盘能否向不同的控件输入。v(2)按钮的信号与槽)按钮的信号与槽v将将10个按钮的个按钮的clicked()信号分别连接()信号分别连接10个不同的槽函数,而个不同的槽函数,而每个槽函数要做的事情就是调用一个方法,以模拟硬键盘上每个槽函数要做的事情就是调用一个方法,以模拟硬键盘上0到到9的的10个不同按键。个不同按键。www.gec-edu.org发散与提高发散与提高v运行结果运行结果v编译并运行改程序,分别通过硬键盘和窗体中的软键盘向两个行文编译并运行改程序,分别通过硬键盘和窗体中的软键盘向两个行文本编辑框输入数字,观察两种输入方式的效果是否相同。本编辑框输入数字,观察两种输入方式的效果是否相同。www.gec-edu.orgwww.gec-edu.org

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号