版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目录摘要IIIAbstractIV第一章前言1Linux 操作系统的产生及发展1Linux 操作系统的特点21.2.1开放. 3真正的多任务多用户3UNIX 的完整实现31.2.4 完全符合IX 标准3良好的用户界面4强大的网络功能4良好的可移植性4设备独立性5第二章 QT 相关技术背景6Qt 概述6QT 发展历史7QT 优点7KDE 和 GNOME8QT 的安装10QT 信号与槽机制11元对象系统(Meta-Object System)16第三章 系统设计与实现18需求分析18系统功能设计19主要的类及抽象数据类型的定义20系统实现21算法设计21程序设计流程23第四章系统测试264.14.
2、2测试定义26测试概述264.34.4测试的原则26测试的内容28验证(verification)28确认(validation)28. 284.5第五章总结30参 考 文 献31致谢32诚信承诺书33基于 QT 的图形用户界面设计摘要Linux 操作系统是现在流行的一种免费的操作系统,它完全符合IX 标准,拥有强大的网络功能和良好的可移植性,系统的开发就是基于这个。为了用户操作的方便,系统用 QT 来实现系统的用户界面,它 是一个跨的 C+ 图形用户界面库,由挪威 TrollTech 公司。本文主要在 QT 框架设计了一个server 端和cnt 端的界面。主要是修改槽和按键,主要实现sen
3、d、connection、Close connection、Quit 这四个按键的功能。接下来实现客户端和服务端各自的算法模块,客户端实现的是判断输入的数是否符合基本要求,输入的数必须是 0 到 9 之间的任何一个整数;而服务端实现的是将输入的数字与事先随机产生的数相比较,若相等,则在客户端输出回答正确,若不等,则提示错误,并输出正确。最后是socket 通信,在server 端和cnt 端各建立多个类模块来实现socket 通信。关键字:Linux;QT;socket 通信Based on the QT graphical usererface designAbstractLinux ope
4、rating system is now a popular free operating system, which fully comply withIX standards, has a strong network function and good portability, system development is based on this platform. For user convenience, the system uses QT to achieve the systems usererface, it is a cross-platform C + + graphi
5、cal usererface library, the company producedby the Norwegian TrollTech. QT framework in this pr designed a server-side andcnt-sideerface. Was modified groove and keys, the main achievemend, connection,Close connection, Quit the function of these four buttons. Then the cnt and server toachieve their
6、algorithm module, the cnt input to achieve is to determine whether thenumber of basic requirements, enter the number betn 0 and 9 must be anyeger; theserver implemen ion is the input the number of randomly generated numbers with the prior comparison, if equal, the output of the c nt to answer correc
7、tly, if so, then an error, and output the correct answer. Finally, socket communication, the server side and c nt side ofthe class module to create multiple socket communication.Keywords: Linux, QT, socket communication第一章前言1.1 Linux 操作系统的产生及发展在 Linux 的发展历程中,Unix 和 Minix 扮演着十分重要的角色。1990 年,芬兰人Linus T
8、orvalads 在间,所以 Linus大学接触到 Unix,但是当时上机学习要排队等候很长的时了自己的PC 机,希望安装一个类似的操作系统。由于 Unix 的内核代码不容易得到,所以他安装了 Minix。Minix 是一个基于微内核技术的类似于 Unix 的操作系统,是 Andrew Tanebaum 教授利用业余时间开发的用于教学的操作系统。当时, Minix 并不是完全免费的,而且 Andrew Tanebaum 教授不允许别人为Minix 再加入其他东西,目的是为了教学的简明扼要。在使用过程中,Linus 受Minix 的启发,决定开发一个自己的操作系统。1991 年,Linus 需要
9、一个简单的终端仿真程序来存取一个组的内容,于是自己编写了一个程序来实现此目的。用 Linus 自己的话说:“在这之后,开发工作可谓一帆风顺,尽管程序代码仍然千头万绪,但此时我已有一些设备,调试也相对较以前容易了。在这一阶段我开始使用 C 语言编写代码,这使得开发工作加快了许多。与此同时,我产生了一个大胆的梦想:制作一个比Minix 更好的Minix。”基本开发工作持续两个月,直到有了一个磁盘驱动和一个小的文件系统。1991 年 8月,Linus 对外发布了一套新的操作系统,源代码放在芬兰最大的 FTP名为Linux 的目录中,Linux 也因此而得名。上,并放在与 Minix 不同,Linux
10、 不是一种公益,不是共享,它是一种,免费的!这里的“”体现在的方面,允许使用者随意更改系统,为系统加入任何功能。也正是这种,使得它不断地发扬光大。1991 年 10 月 5 日,Linus 宣布了Linux 系统的第一个正式的版本,其版本号为 0.02。此版本的Linux 能够运行gun 的bourne again s但是应用程序还不多。bash s以及gun 的编译器gcc,Linus 是一个完全的理想主义者,他希望 Linux 是一个完全免费的操作系统。1993年,Linux 的第一个“产品”版 1.0 问世时,是按完全所有的源码必须公开,而且任何人均不得从 Linu扩散进行扩散的。它要求
11、易中获利。同时,Linux 给了用户充分的,它从一开始就连同源代码一起提供给服务用户,允许用户进行任何更改,增加任何功能。Linus 采用了一个比 GPL 还要严格的由的。但是,半年之后,他渐渐地发现这种纯粹证以确保Linux 内核是自方式实际上限制了Linux的的。于是,Linus 转身了 GNU 的 GPL。也正是由于采用了 GPL,Linux版。(蓉,2005)今天才有如此多的要使 Linux 成为一个理想的操作系统,是一项十分巨大的工程。Linus 认识到单靠一个人的力量是的,它需要来自世界各地的编程共同努力。因此任何人想往内核中加入新的特性,只要被认为是有用的,合理的。Linus 就
12、允许加入。就这样,Linux在来自世界各地的众的共同协作下发展了起来。下面是Linux 发展过程中的重要里程碑。1990 年,Linus Torvalad 首次接触Minix;1991 年,Linus Torvalad 开始在Minix 上编写各种驱动程序等操作系统内核组件;1991 年,Linus Torvalad 公开了Linux 内核;1993 年,Linux 1.0 版,Linux 转向 GPL协议;1994 年,Linux 的第一个商业版式Slackware 问世;1996 年,IX 标准;技术局的计算机系统确认 Linux 版本 1.2.13 符合1997 年,Linux 的简体中
13、文版相继问世;2001 年,Linux 2.4 版内核发布;2003 年,Linux 2.6 版内核发布;1.2 Linux 操作系统的特点Linux 作为一种流行的操作系统,在市场上占有越来越大的份额,很多人特别是程序员纷纷转向Linux,Linux 逐渐成为的一个强劲对手。Linux 是类 Unix 的实现,具有强大的功能,很好地支持了各种现代编程技术,具有以下主要特点。1.2.1开放Linux 是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码,这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了Linux 的修改,编写工作,程序员可以
14、根据自己的和灵感对其进行改变。这让Linux 吸收了无数程序员的精华,不断壮大。它开放源码并对外免费提供,在ernet 上。者可以按照自己的需要修改,和发布程序的源码,并(S.Balakrishnam,2003)1.2.2 真正的多任务多用户Linux 充分利用了x86 CPU 的任务切换机制,实现了真正多任务,多用户环境,允许多个用户同时执行不同的程序,并且可以给紧急任务以较高的优先级。多任务是现代主要的一个特点,它指计算机同时执行多个程序,而且各个程序的运行互相独立。Linux系统调度每一个进程地使用CPU。由于CPU 的处理速度非常快,各个被启动执行的程序看起来好像在并行运行。事实上,从
15、 CPU 执行一个程序中的一组指令到 Linux调度CPU 两次运行这个程序之间有很短的时间延迟,但用户是感觉不到的。1.2.3 UNIX 的完整实现从发展的背景看,Linux 与其他操作系统有着明显的区别。Linux 是从一个比较成操作系统 Unix 发展而来的,Unix 上绝大多数命令都可以在Linux 里找到并有所加强。可以认为它是 Unix 系统的一个变种,因而 Unix 的优良特点(如可靠性,稳定性,强大的网络功能,强大的数据库支持能力以及良好的开放性等)都在 Linux 上一一体现出来。同时在 Linux 的发展过程中。Linux 的用户能够直接使用与 Unix 相关的支持和帮助。
16、1.2.4 完全符合IX 标准IX 是基于 Unix 的第一个操作系统簇国际标准。Linux 遵循这一标准,使得 Unix下许多应用程序可以很容易地移植到Linux 下,相反也是如此。Linux 完全兼容IX 1.0 标准,可以在 Linux 下通过相应的模拟器运行常见的DOS,Windows 程序。这为用户从Windows 转到Linux 奠定了基础。1.2.5 良好的用户界面Linux 向用户提供了两种界面:用户界面和系统调用。Linux 的传统用户界面是基于命令行的界面。即 Unix 系统的S存入文件后提交系统批量自动执行。S界面,它既可以联机实时逐条输入执行,也可以有很强的设计能力,用
17、户可以方便地用它编制程序,从而为用户扩充系统功能提供更高级段。可编程 S是指将多条命令组合在一起,形成一个 S程序。这个程序可以单独运行,也可以与其他程序同时运行。Linux 的系统调用界面是供用户编程时使用的,用户可以在编程时直接使用系统提供的系统调用命令。另外,Linux 通过使用鼠、菜单、窗口和滚动条还为用户提供了一个直观,易操作及交互性强大的图形化界面。1.2.6 强大的网络功能互联网是在 Unix 的基础上繁荣起来的,Linux 的网络功能当然不会逊色。Linux 的网络功能和其内核紧密相连,在这方面Linux 要优于其他操作系统。在Linux 中,用户可以轻松实现网页浏览,文件传输
18、,登录等网络工作。Linux 强大的网络功能首先体现在对ernet 的使用的支持。Linux 免费提供了大量支持ernet 的。用户能够用 Linux 与世界上其他人进行通信。Linux 强大的网络功能还体现在文件传输能力上。用户能通过一些 Linux 命令完成信息或文件的传输。也是 Linux 系统提供的重要网络功能,Linux 不仅允许通过网络进行广播电台程序的传输,还为系统管理员和技术提供了通过网络其他系统的窗口。借助这各的能力,无论系统在地理上位于休息技术都能够有效地为多个系统服务。(谢,2008)Linux 不仅能够作为网络工作站使用还可以作为服务器提供 WWW、FTP、等服务。1.
19、2.7 良好的可移植性可移植性是指将操作系统从一种计算机硬件转移到另一种计算机硬件后,仍然能够按其自身方式运行的能力。Linux 是一种可移植的操作系统,能够在从微型到大型的任何环境和任何上运行。可移植性为运行 Linux 系统的计算机与其他计,而不需要另外增加特殊的通口。Linux 可算机进行准确而有效的通信提供了以运行在多种硬件上。如具有x86、680 x0、SPARC、ALPHA 等处理器的。同时Linux 还支持多处理器技术、多个处理器同时工作,从而使系统性能大大的提高。此外,Linux 还是一种操作系统,可以运行在掌上电脑、机顶盒或机上。2001年 1 月发布的 Linux 2.4
20、版内核已经能够完全支持er64 位架构。1.2.8 设备独立性设备独立性是指操作系统把所有外部设备当作文件,只要安装了它们的驱动程序,任何用户都可以像使用文件一样,使用这些设备,而不必知道它们的具体形式设备独立性的关键在于内核的适应能力。其他操作系统只允许一定数量或一定种类的外部设备连接。而具有设备独立性的操作系统能够容纳任意种类及任意数量的设备,因为每一个设备老师通过与内核的连接独立进行。Linux 量具有设备独立性的操作系统,它的内核具有高度适应能力。随着的程序员加入Linux 编程,会胡硬件设备加入到各种Linux 内核和版本中。别处,由于用户可以到Linux 的内核源代码,因此用户可以
21、修改内核源代码,以便适应新增加的外部设备。第二章 QT 相关技术背景2.1 Qt 概述Qt 是Trolltech 公司的一个产品。Qt 是一个多的C+图形用户界面应用程序框架。它提供给应用程序开发者建立图形用户界面应用程序所需的所有功能。Qt 是完全面象的,它很容易扩展,并且允许真正的组件编程。自从 1996 年早些时候,Qt 进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础。Qt 也是流行的Linux 桌面环境KDE 的基础。(KDE 是所有主要的Linux版的一个标准组件)Qt 支持下述:MS/Windows - 95、98、NT 4.0、ME、和 2000Unix/X11
22、- Linux、Sun和其它很多 X11、paq Tru64 UNIX、IBM AIX、SGI IRIXMacosh - Mac OS XEmbedded - 有帧缓冲(frame buffer)支持的Linux。Qt 提供了一组范围相当广泛的C+类库,并包含了几种命令行和图形界面的工具,有效地使用这些工具可以加速开发过程。主要组成部分如下所示。Qt Designer:Qt 设计器。用来可视化地设计应用程序界面。Qt Linguist:Qt 语言学家。用来翻译应用程序。以此提供对多种语言的支持。Qmake:使用此工具可以由简单的、与Makefile。无关的工程文件来生成编译所需的Qt Assi
23、stant:关于 Qt 的帮助文件。类似于MSDN。可以快速地发现你所需要的帮助。moc:元对象编译器。uic:用户界面编译器。在程序编译时被自动调用,通过 ui_*.h 文件生成应用程序界面。qembed:转换数据,比如,将Linux 下 Qt 开发环境搭建转换为C+代码。2.2 QT 发展历史Qt 是一个跨的 C+ 图形用户界面库,由挪威 TrollTech 公司,目前包括 Qt, 基于 Framebuffer 的 Qt Embedded,快速开发工具 Qt Designer,工具 QtLinguist 等部分 Qt支持所有 Unix,2008)系统,当然也包括 Linux,还支持 Win
24、NT/Win2k,Win95/98Trolltech。(公司在 1994 年成立,但是在 1992 年,成立 Trolltech 公司的那批程序员 就已经开始设计 Qt 了,Qt 的第一个商业版本于 1995 年推出然后 Qt 的发展就很快了,下面是 Qt 发展史上的一些里程碑:1996 Oct KDE 组织成立1998 Apr 05 Trolltech 的程序员在 5天之内将Netsc5.0从Motif移植到Qt上1998 Apr 08 KDE Free Qt1998 Jul 09 Qt 1.40 发布1998 Jul 12 KDE 1.0 发布1999 Mar 04 QPL 1.0 发布1
25、999 Mar 12 Qt 1.44 发布1999 Jun 25 Qt 2.0 发布1999 Sep 13 KDE 1.1.2 发布成立2000 Mar 20Qt 发布2000 Sep 06 Qt 2.2 发布2000 Oct 05 Qt 2.2.1 发布2000 Oct 30 Qt/Embedded 开始使用 GPL2000 Sep 04 Qt free edition开始使用 GPL2.3 QT 优点基本上,Qt 同 X Window台上的 MFC、OWL、VCL、上的 Motif、Openwin、GTK等图形界面库和 Windows是同类型的东西,但是 Qt 具有下列优点。优良的跨特性Q
26、t 支持下列操作系统:Windows 95/98、Windows NT、Linux、SolarinOS、HP-UX、DigitaIX (OSF/1, Tru64)、 Irix,FreeBSD、BSD/OS、SCO、AIX、 OS390、QNX 等等。面象Qt 的良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常 方便的。 Qt 提供了一种称为 signals/slots 的安全类型来替callback,这使得各个元件之间的协同工作变得十分简单。丰富的 APIQt 包括多达 250 个以上的 C+ 类,还替供基于模板的 collectionsserializatio
27、n、 file、I/O device、 directory management、 date/time 类。甚至还包括正则表达式的处理功能。(1)(2)(3)支持 2D/3D 图形渲染,支持 OpenGL。大量的开档。XML 支持。2.4 KDE 和 GNOME但是真正使得 Qt 在界的众多 Widgets(如 Lesstif、Gtk、EZWGL、Xforms、fltk 等等)中脱颖而出的还是基于 Qt 的重量级Trolltech 公司承受巨大压力的一个原因。下面- KDE/QT .VS. Gnome/Gtk 是怎么发生的。KDE。 有趣的是,KDE 也是使得来看看这场著名的在 Unix 的图
28、形界面一向是以 MIT 的 X Window 系统为标准,在商业应用上有两大流派,一派是以 Sun 公司的 Openlook 阵营,一派是 IBM/HP的OSF (Open Software Foundation) 的 Motif, 双方经过多年竞争之后, Motif 最终胜出,成为最普遍使用的界面库,后来双方又妥协出一个 CDE(Common Desktop Enviroment)作为一个标准的图形界面。但是 Motif/CDER 的价格非常昂贵,在这同时微软的 Windows 图形界面发展速度非常快,而 Unix 界的后起之秀 Linux 也急需一个可靠并且免费的图形界面1。1996 年
29、10 月,由开发图形排版工具 Lyx 的德国人 Matthias Ettrich 发起了 KDE 计划。 KDE用 GPL的全称为 K Desktop Environment,可以看出是针对 CDE。KDE 本身 是采的,但是 KDE 却是使用 Qt 来作为其底层库,因为当时 Qt 已经将其Unix 版本发布了,但是 Qt 并不遵循 GPL, 因此 KDE 被很多的作者,认为利用非开发违背了 GPL 的精神,于是 GNU 的狂热信徒兵分两路,一路是去制作 Harmonny,试图重写一套兼容于 Qt 的替代品,另一路是由一个 26岁的墨西哥程序员 Miguel De Icaza下重新开发一套叫
30、GNOME(GNU NetworkObject Enviroment)来替代由于 Linux 界的了几个全职程序员来加入KDE。RedHat 不喜欢 KDE/Qt 的,因此RedHat 甚至专门派出Motif VS Openlook 相GNOME 进行开发工作,于是一场同似的就这么打起来了。Trolltech 为了 KDE 曾数次修改 Qt,从成立 KDE的Free Qt到采用 QPL,可谓是费尽心机,但是 GNOME 采用的 GTK 一开始就是完全的 GPL,因此在这个方 面 GNOME 有一定的优势,加上 Qt/KDE 采用 C+ 开发,入门的门槛比较高,而 GTK/Gnome 采用 C,
31、 因此 GNOME 吸引了的开发者,但是 KDE 毕竟先走了一步, 推出的 KDE1.1.2 十分稳定, 而当时急忙中推出的 GNOME1.0 的系统稳定性奇差,有人甚至笑称 GNOME1.0 还没有 KDE 1.0 Alpha 稳定。但是 GNOME 后来发展比较快,大有迎头赶上的势头。当时双方的开发者在网络 上炒得天翻地覆,连 Linux 之父 Linus 只是说了一句喜欢用 KDE 都倍受指责。到了第三个年头,也就是 2000 年,可谓是风云突变,一个接一个的事件先后发生:首先是一批从 Apple 公司出来的工程师成立了一个叫 Eazel 的公司替GNOME GNOME为庞大的设计界面,
32、然后是一批 GNOME 程序员成立了一个 Helix Code 公司替提供商业支持,而大家期待以久的 KDE 2.0 也终于发布了,这恐怕是目前最了之一, 除了 KDE 本身,还包括 Koffice 套件,Kdevelop 等等大批,其主力Kounqueror 也是第一个可以同微软的ernet Exploer 相抗衡的浏览器。 而 Sun一个 GNOME公司,Red Hat 公司, Eazel 公司,Helix Code 等一批公司成立了,Sun 还宣布将把重量级办公Star office 同 GNOME 集成,Trolltech 公司自然不能坐以待毙,于今年 10 月 4 日将 Qt 的 f
33、ree edition 变为 GPL 宣言,彻底解决了 KDE 的力的回击。到现在为止,这场问题,又推出了Qt ,给了 GNOME 阵营一个有不能很快看到结果。一般说来,还在继续,相信目前 GNOME 吸引的公司比较多,但是 KDE/Qt的开发的效率和质量比 GNOME高,而且在 Office/环境中先走一步,在一定时间内还将处于优势地位。(W.RichardStevens,Stephen A.Rago,2003)2.5 QT 的安装一般来说,居于 Qt/Embedded 开发的应用程序最终会发布到安装有Linux 操作系统的小型设备上,所以使用装有 Linux 操作系统的 PC 或工作站来完
34、成 Qt/Embedded 开发是最理想的环境,当然它也可以安装在 UNIX 和 Windows 系统上。在一台装有Linux 操作系统的机器上建立 Qt/Embedded 开发环境,首先需要准备安装包:tmake 工具安装包、Qt/Embedded 安装包和 Qt 的 X11 版的安装包。这些可以免费从Trolltech 的 Web 或FTP 服务器上。其中各安装包的主要作用是 tmake 1.11或更高版本生成 Qt/Embedded 应用工程的 Makefile 文件; Qt/Embedded 2.3.7 是Qt/Embedded 的安装包;Qt 2.3.2 for X11 将产生x11
35、 开发环境所需要的两个工具2。由于安装包有许多不同版本,版本不同在使用时将造成。所以在使用时要注意一下安装原则:选择或了 Qt/Embedded 的某个版本的安装包之后,下一步选择安装的Qt for X11 的安装包的版本必须比最先的Qt/Embedded 的版本旧,这是因为Qt forX11 的安装包的两个工具 uic 和 designer 产生的源文件会和 Qt/Embedded 的库一起被编译,本着“向前兼容”的原则,Qt for X11 的版本应比 Qt/Embedded 的版本旧。1、安装tmake在Linux 命令模式下运行以下命令:tar xft tmake-1.11.tar.g
36、zexport TMAKEDIR=$PWD/tmake-1.11export TMAKEPATH=$TMAKEDIR/lib/qws/linux-X86-g+ export PATH=$TMAKEDIR/bin:$PATH2、安装 Qt/Embedded 2.3.7在Linux 命令模式下运行以下命令:tar xft qt-embedded-2.3.7.tar.gz cd qt-2.3.7export QTDIR=$PWD export QTEDIR=$QTDIRexport PATH=$QTDIR/bin:$LD_LIBRARY_PATH./configure qconfig qvfb de
37、pths 4,8,16,32 make sub-srccd .“./configure qconfig qvfb depths 4,8,16,32”指定 Qt工具qvfb,并支持 4,8,16,32 位的显示颜色深度。“make sub-src”指定按精简方式编译开发包。Qt开发包生成虚拟缓冲帧开发包有 5 种编译范围的选项,使用这些选项可控制 Qt 生成的库文件的大小,编译选项的具体用法运行“./configure-help”查看。3、安装 Qt/X11 2.3.2在Linux 命令行模式下运行以下命令:tar xfz qt-x11 -2.3.2.tar.gz cd qt-2.3.2expo
38、rt QTDIR=$PWDexport PATH=$QTDIR/bin:$PATHexport LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH./configure no opengl makemake C tools/qvfb mv tools/qvfb/qvfb bin cp bin/uic $QTDIR/bin cd .根据开发环境可在configure 的参数中添加别的参数,可键入“./configure -help”来查看。2.6 QT 信号与槽机制信号和槽机制是 QT 的机制,要精通 QT 编程就必须对信号和槽有所了解。信号和槽是一种高级接口
39、,应用于对象之间的通信,它是 QT 的特性,也是 QT 区别于其它工具包的重要地方。信号和槽是 QT 自行定义的一种通信机制,它独立于标准的C/C+语言,因此要正确的处理信号和槽,必须借助一个称为 moc(Meta Object Compiler)的 QT 工具,该工具是一个 C+预处理程序,它为附加代码。次的事件处理自动生成所需要的在所熟知的很多 GUI 工具包中,窗口小(widget)都有一个回调函数用于响应它们能触发的每个动作,这个回调函数通常是一个指向某个函数的指针。但是,在QT 中信号和槽取代了这些凌乱的函数指针,使得编写这些通信程序更为简洁明了。信号和槽能携带任意数量和任意类型的参
40、数,他们是类型完全安全的,不会像回调函数那样产生core dumps。所有从 QObject 或其子类(例如 Qwidget)派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射(emit)出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号。这就是真正的信息封装,它确保对象被当作一个真正的组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。(trolltech,2005)你可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接,甚至于将一个信号与另外一个信号相连接也是可
41、能的,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的编程机制。(Jasmin Blanchette,1998)当某个信号对其客户或所有者发生的状态发生改变,信号被一个对象发射。只有 定义过这个信号的类及其派生类能够发射这个信号。当一个信号被发射时,与其相关联的槽将被立刻执行,就象一个正常的函数调用一样。信号-槽机制完全独立于任何GUI 事件循环。只有当所有的槽返回以后发射函数(emit)才返回。 如果存在多个槽与某个信号相关联,那么,当这个信号被发射时,这些槽将会一个接一个地执行,但是它们执行的顺序将会是随机的、不确定的,不能人为地指定哪个先执行、哪个
42、后执行。信号的是在头文件中进行的,QT 的signals 关键字进入了信号区,随后即可自己的信号。槽是普通的C+成员函数,可以被正常调用,它们唯一的特殊性就是很多信号可以与其相关联。当与其关联的信号被发射时,这个槽就会被调用。槽可以有参数,但槽的参数不能有缺省值。既然槽是普通的成员函数,因此与其它的函数一样,它们也有存取权限。槽的存取权限决定了谁能够与其相关联。同普通的C+成员函数一样,槽函数也分为三种类型,即public slots、private slots 和protected slots。public slots:在这个区内的槽意味着任何对象都可将信号与之相连接。这对于组件编程非常有用
43、,你可以创建彼此互不了解的对象,将它们的信号与槽进行连接以便信息能够正确的传递。protected slots:在这个区内的槽意味着当前类及其子类可以将信号与之相连接。这适用于那些槽,它们是类实现的一部分,但是其界面接口却面向外部。private slots:在这个区内用于联系非常紧密的类。的槽意味着只有类自己可以将信号与之相连接。这适槽也能够为虚函数,这也是非常有用的。槽的也是在头文件中进行的。通过调用 QObject 对象的 connect 函数来将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用。该函数的定义如下:bool QObject:con
44、nect ( const QObject * sender, const char * signal, const QObject * receiver, const char * member ) sic 。这个函数的作用就是将发射者 sender 对象中的信号 signal 与接收者 receiver 中的member 槽函数联系起来。当指定信号 signal 时必须使用 QT 的宏SIGNAL(),当指定槽函数时必须使用宏SLOT()。如果发射者与接收者属于同一个对象的话,那么在 connect调用中接收者参数可以省略。元对象编译器 moc(meta object compiler)对
45、C+文件中的类进行分析并产生用于初始化元的C+代码,元对象包含全部信号和槽的名字以及指向这些函数的指针。moc 读C+源文件,如果发现有 Q_OBJECT 宏的类,它就会生成另外一个 C+源文件,这个新生成的文件中包含有该类的元对象代码。例如,假设有一个头文件mysignal.h,在这个文件中包含有信号或槽的,那么在编译之前 moc 工具就会根据该文件自动生成一个名为mysignal.moc.h 的C+源文件并将其提交给编译器;类似地,对应于mysignal.cpp 文件moc 工具将自动生成一个名为mysignal.mo译器3。p 文件提交给编元对象代码是signal/slot 机制所必须的
46、。用 moc 产生的 C+源文件必须与类实现一起进行编译和连接,或者用#include 语句将其包含到类的源文件中。moc 并不扩展#include 或者#define 宏定义,它只是简单的跳过所遇到的任何预处理指令。一个小例子一个最小的C+类 class Foopublic:Foo ();如下:value () const return val ;void setValue ( private:val;);一个小的 Qt 类如下:Class Foo: public QObject Q_OBJECTPublic:Foo ();value () const return val ; public
47、 slots:void setValue(signals:);void valueChanged (); private:val;这个类有同样的状态,和公有方法状态,但是另外它也支持使用信号和槽的组件编程:这个类可以通过发射一个信号:valueChanged()来告诉外界它的状态发生了变化,并且它有一个槽,其它对象可以发送信号给这个槽。所有包含信号和/或者槽的类必须在它们的中提到 Q_OBJECT4。槽可以由应用程序的编写者来实现。这里是Foo:setValue()一个可能的实现:Void Foo:setValue (if (v != val) val = v;v)emit valueChan
48、ged (v);emit valueChanged(v)这一行从对象中发射valueChanged 信号。正如你所能看到的,你通过使用emit signal(arguments)来发射信号。下面是把两个对象连接在一起的法:Foo a, b;connect (&a, SIGNAL (valueChanged ( b.setValue (11); / a = undefined b = 11), &b, SLOT (setValue ();a.setValue (79); / a = 79b.value ();b = 79调用a.setValue(79)会使 a 发射一个valueChanged(
49、) 信号,b 将会在它的 setValue()槽中接收这个信号,也就是 b.setValue(79) 被调用。接下来 b 会发射同样的 valueChanged()信号,但是因为没有槽被连接到b 的valueChanged()信号,所以没有发生任何事(信号了)。注意:只有当 v != val 的时候 setValue()函数才会设置这个值并且发射信号。这样就避免了在循环连接的情况下(比如 b.valueChanged() 和 a.setValue()连接在一起)出现无休止的循环的情况。这个例子说明了对象之间可以在互相不知道的情况下一起工作,只要在最初的时在它们中间建立连接。预处理程序改变或者移
50、除了 signals、slots 和emit 这些关键字,这样就可以使用标准的C+编译器。在一个定义有信号和槽的类上运行moc。这样就会生成一个可以和其它对象文件编译和连接成程序的C+源文件。2.7 元对象系统(Meta-Object System)Qt 的一个最主要的特点可能就是它扩展了C+的机制,可以创建独立的这些组件可以被绑定在一起,而不需要互相的任何了解。组件,这个机制被成为元对象系统,它提供了两个关键服务:信号/槽、运行时的类型信息和动态属性系统(内省机制)。内省机制对于实现信号和槽是必须的,并且允许应用程序员在程序运行时获得“元信息”(包括被对象支持的信号和槽的列表,以及这些信号/
51、槽所在的类的名称)。内省机制同时支持“”(对于 Qt Designer)和文本翻译(国际化),它还是 Qt 应用程序(Qt Script for Application)的基础。标准的C+并不提供对于 Qt 的元对象系统所需要的动态元信息的支持。Qt 提供了一个单独的工具:元对象编译器(moc)来解决这个问题。Moc 用来Q_OBJECT类的定义,使这些信息在 C+函数中可用。由于 moc 使用纯粹的 C+函数来实现,所以 Qt 的元对象系统在任何 C+编译器下都可以工作。元对象系统这样工作:Q_OBJECT 宏一些内省函数(metaObject(),TR(),qt_mall()和少量其他的函
52、数)。这些函数必须在所有的 QObject 的子类中被实现。Qt 的moc 工具负责执行被 Q_OBJECT 宏的函数,同时负责执行所有的信号函数。QObject 的成员函数,例如connect()和disconnect(),使用内省函数来工作。元对象系统基于以下三类:1)、QOBJECT 类;2)、类中的私有段的 Q_OBJECT 宏;3)、元对象编译器。MocC+源文件。如果它发现其中包含一个或多个类的中含有 Q_OBJECT宏,它就会给含有 Q_OBJECT 宏的类生成另一个含有元对象代码的 C+源文件。这个生成的源文件可以被类的源文件包含(#include)到或者和这个类的实现一起编译
53、和连接5。除了提供对象间通讯的信号和槽机制之外(这也是介绍这个系统的主要原因),QObject 中的元对象代码也实现其它特征:1)、claame()函数在运行的时候以字符串返回类的名称,不需要 C+编译器中的运行时刻类型识别(RTTI)的支持。2)、inherits()函数返回这个对象是否是一个继承于 QObject 继承树中一个特定类的类的实例。3)、tr()和 trUtf8()两个函数是用于的字符串翻译。4)、setPorperty()和 property()两个函数是用来通过名称动态设置和获得对象属性的。 5)、metaObject()函数返回这个类所关联的元对象。虽然使用 QObjec
54、t 作为一个基类而不使用 Q_OBJECT 宏和元对象代码是可以的,但是如果 Q_OBJECT 宏没有被使用,那么这里的信号和槽以及其它特征描述都不会被提供。根据元对象系统的观点,一个没有元代码的 QObject 的子类和它含有元对象代码的最近的祖先相同。举例来说就是,claame()将不会返回你的类的实际名称,返回的是它的这个祖先的名称。强烈建议 QObject 的所有子类使用 Q_OBJECT 宏,而不管它们是否实际使用了信号、槽和属性。第三章 系统设计与实现3.1 需求分析系统设计准备工作如下所示。(1)Qt Designer 是设计窗口组件(Widget)的应用程序,在安装 Qt 的b
55、in 目录下键入./designer,将启动一个包含很多 Qt 组件的可视化界面。在此组织应用程序的各组件分布很方便,最后可生成一个file.ui 和main.cpp 文件;file.ui 是用 XML 语言写的一个文本6。(2)Uic(Usererface Compiler)是从 XML 文件生成代码的用户界面编译器,用来将file.ui 文件生成file.h 和file.cpp 文件(命令如:uic -o file.h file.ui uic -o file.cpp -i file.h file.ui),但生成的这两个文件不是标准的纯 C+代码.通常称为 Qt 的 c+扩展.因为 Qt的对
56、象问中运用了信号/槽的通信机制,在文件中用 Q_OBJECT 宏来标识。(3)用 qmake 工具生成 文件,在设置好环境变量后,用 tmake 工具生成Makefile 文件(tmake 是跨Makefile);不管在Pc 环境、Qt/Embedded 环境还是交叉编译环境中都能生成相应的Makefile 文件。(4)moc(元对象编译器)用来一个C+文件中的类并且生成初始化对象的c+代码,moc 在c+源文件,如果发现其中一个或多个类的中含有 Q_OBJECT宏,就给出这个使用 Q_OBJECT 宏的类生成另外一个包含元对象代码的C+元文件;元对象代码对信号/槽机制、运行时类型信息和动态属
57、性系统是需要的7。(5)用 make 命令生成可执行的二进制代码文件;由于使用 tmake 生成 Makefile 文件,当需要的时候,编译规则中包含调用 moc(元对象编辑器),自动地被连编系统调用,不需要手工调用。由于是用程序实现界面的设计,而不是用 QT 设计器,所以在程序里必须用 QT 语言设计cnt 客户端和server 服务端的界面;客户端的程序主要是实现客户端界面设计、创建socket 以及连接各种各样的信号界面上各种按键的功能。服务端的额程序是主要实现处理客户端的请求、处理服务器新的连接和为服务器提供一个 GUI 界面。输入的形式和输入值的范围用键盘输入数据,并且数据必须是在
58、0 到 9 的范围内的整数。输出的形式当输入时 0 到 9 内的任何一个整数时,如果与事先随机产生的数字相等,则提示用户猜对了。否则,提示错误并把正确数字发送给客户显示出来。当输入的是字符或空格时,将提示输入 0 到 9 范围内的数字。3.2 系统功能设计启动N端为 4800 且IP 为服务器的 IP?Y范N图 3.1 客户端业务流程图输入数据位 0-9围内的整数?Y输入的数与随机产生的数相等?Y提示正确N提示输入正确的数提示错误,并输出正确连接失败启动N客户端连接上服务端?Y关闭图 3.2服务器端业务流程图图 3.3 通信机制原理图3.3 主要的类及抽象数据类型的定义CntSocket 类:
59、定义CntSocket 类公有继承 QSocket,服务器与客户端建立连接后,服务器创建一个CntSocket 来处理请求。没有任何显示显示新连接SimpleServer 类:定义SimpleServer 类公有继承 QServerSocket,SimpleServer 类用来处理服务器新的连接,对于每一个客户端的连接,它都创建一个新的 C ntSocket, SimpleServer 用来处理与客户端的联系。ServerInfo 类:定义 ServerInfo 类公有继承 QVBox,为服务器提供一个 GUI 界面8。QserverSocket 类: QServerSocket 是 serv
60、er socket 的一个封装。QServerSocket 是一个基于 TCP/IP 的服务器类,它能建立服务器状态,当有到请求后,就会建立其一个处理连接的socket 来,因此,在服务器端,需要同时使用 QSocket, QServerSocket类9。Qsocket 类 :QSocket 类提供了一个有缓冲的TCP 连接,在这个类中,可以调用的connectToHost()、bytesAvailable()、canReadLine()这些函数。connectToHost()是一个最常用的函数,打开一个被命名的主机的连接。当 connectToHost()已经完成它的 DNS 查找并且正在开
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论