




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、目錄摘要IIIAbstractIV第一章前言1Linux 操作系統(tǒng)的產(chǎn)生及發(fā)展1Linux 操作系統(tǒng)的特點(diǎn)21.2.1開(kāi)放. 3真正的多任務(wù)多用戶3UNIX 的完整實(shí)現(xiàn)31.2.4 完全符合IX 標(biāo)準(zhǔn)3良好的用戶界面4強(qiáng)大的網(wǎng)絡(luò)功能4良好的可移植性4設(shè)備獨(dú)立性5第二章 QT 相關(guān)技術(shù)背景6Qt 概述6QT 發(fā)展歷史7QT 優(yōu)點(diǎn)7KDE 和 GNOME8QT 的安裝10QT 信號(hào)與槽機(jī)制11元對(duì)象系統(tǒng)(Meta-Object System)16第三章 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)18需求分析18系統(tǒng)功能設(shè)計(jì)19主要的類(lèi)及抽象數(shù)據(jù)類(lèi)型的定義20系統(tǒng)實(shí)現(xiàn)21算法設(shè)計(jì)21程序設(shè)計(jì)流程23第四章系統(tǒng)測(cè)試264.14.
2、2測(cè)試定義26測(cè)試概述264.34.4測(cè)試的原則26測(cè)試的內(nèi)容28驗(yàn)證(verification)28確認(rèn)(validation)28. 284.5第五章總結(jié)30參 考 文 獻(xiàn)31致謝32誠(chéng)信承諾書(shū)33基于 QT 的圖形用戶界面設(shè)計(jì)摘要Linux 操作系統(tǒng)是現(xiàn)在流行的一種免費(fèi)的操作系統(tǒng),它完全符合IX 標(biāo)準(zhǔn),擁有強(qiáng)大的網(wǎng)絡(luò)功能和良好的可移植性,系統(tǒng)的開(kāi)發(fā)就是基于這個(gè)。為了用戶操作的方便,系統(tǒng)用 QT 來(lái)實(shí)現(xiàn)系統(tǒng)的用戶界面,它 是一個(gè)跨的 C+ 圖形用戶界面庫(kù),由挪威 TrollTech 公司。本文主要在 QT 框架設(shè)計(jì)了一個(gè)server 端和cnt 端的界面。主要是修改槽和按鍵,主要實(shí)現(xiàn)sen
3、d、connection、Close connection、Quit 這四個(gè)按鍵的功能。接下來(lái)實(shí)現(xiàn)客戶端和服務(wù)端各自的算法模塊,客戶端實(shí)現(xiàn)的是判斷輸入的數(shù)是否符合基本要求,輸入的數(shù)必須是 0 到 9 之間的任何一個(gè)整數(shù);而服務(wù)端實(shí)現(xiàn)的是將輸入的數(shù)字與事先隨機(jī)產(chǎn)生的數(shù)相比較,若相等,則在客戶端輸出回答正確,若不等,則提示錯(cuò)誤,并輸出正確。最后是socket 通信,在server 端和cnt 端各建立多個(gè)類(lèi)模塊來(lái)實(shí)現(xiàn)socket 通信。關(guān)鍵字: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 操作系統(tǒng)的產(chǎn)生及發(fā)展在 Linux 的發(fā)展歷程中,Unix 和 Minix 扮演著十分重要的角色。1990 年,芬蘭人Linus T
8、orvalads 在間,所以 Linus大學(xué)接觸到 Unix,但是當(dāng)時(shí)上機(jī)學(xué)習(xí)要排隊(duì)等候很長(zhǎng)的時(shí)了自己的PC 機(jī),希望安裝一個(gè)類(lèi)似的操作系統(tǒng)。由于 Unix 的內(nèi)核代碼不容易得到,所以他安裝了 Minix。Minix 是一個(gè)基于微內(nèi)核技術(shù)的類(lèi)似于 Unix 的操作系統(tǒng),是 Andrew Tanebaum 教授利用業(yè)余時(shí)間開(kāi)發(fā)的用于教學(xué)的操作系統(tǒng)。當(dāng)時(shí), Minix 并不是完全免費(fèi)的,而且 Andrew Tanebaum 教授不允許別人為Minix 再加入其他東西,目的是為了教學(xué)的簡(jiǎn)明扼要。在使用過(guò)程中,Linus 受Minix 的啟發(fā),決定開(kāi)發(fā)一個(gè)自己的操作系統(tǒng)。1991 年,Linus 需要
9、一個(gè)簡(jiǎn)單的終端仿真程序來(lái)存取一個(gè)組的內(nèi)容,于是自己編寫(xiě)了一個(gè)程序來(lái)實(shí)現(xiàn)此目的。用 Linus 自己的話說(shuō):“在這之后,開(kāi)發(fā)工作可謂一帆風(fēng)順,盡管程序代碼仍然千頭萬(wàn)緒,但此時(shí)我已有一些設(shè)備,調(diào)試也相對(duì)較以前容易了。在這一階段我開(kāi)始使用 C 語(yǔ)言編寫(xiě)代碼,這使得開(kāi)發(fā)工作加快了許多。與此同時(shí),我產(chǎn)生了一個(gè)大膽的夢(mèng)想:制作一個(gè)比Minix 更好的Minix。”基本開(kāi)發(fā)工作持續(xù)兩個(gè)月,直到有了一個(gè)磁盤(pán)驅(qū)動(dòng)和一個(gè)小的文件系統(tǒng)。1991 年 8月,Linus 對(duì)外發(fā)布了一套新的操作系統(tǒng),源代碼放在芬蘭最大的 FTP名為L(zhǎng)inux 的目錄中,Linux 也因此而得名。上,并放在與 Minix 不同,Linux
10、 不是一種公益,不是共享,它是一種,免費(fèi)的!這里的“”體現(xiàn)在的方面,允許使用者隨意更改系統(tǒng),為系統(tǒng)加入任何功能。也正是這種,使得它不斷地發(fā)揚(yáng)光大。1991 年 10 月 5 日,Linus 宣布了Linux 系統(tǒng)的第一個(gè)正式的版本,其版本號(hào)為 0.02。此版本的Linux 能夠運(yùn)行g(shù)un 的bourne again s但是應(yīng)用程序還不多。bash s以及gun 的編譯器gcc,Linus 是一個(gè)完全的理想主義者,他希望 Linux 是一個(gè)完全免費(fèi)的操作系統(tǒng)。1993年,Linux 的第一個(gè)“產(chǎn)品”版 1.0 問(wèn)世時(shí),是按完全所有的源碼必須公開(kāi),而且任何人均不得從 Linu擴(kuò)散進(jìn)行擴(kuò)散的。它要求
11、易中獲利。同時(shí),Linux 給了用戶充分的,它從一開(kāi)始就連同源代碼一起提供給服務(wù)用戶,允許用戶進(jìn)行任何更改,增加任何功能。Linus 采用了一個(gè)比 GPL 還要嚴(yán)格的由的。但是,半年之后,他漸漸地發(fā)現(xiàn)這種純粹證以確保Linux 內(nèi)核是自方式實(shí)際上限制了Linux的的。于是,Linus 轉(zhuǎn)身了 GNU 的 GPL。也正是由于采用了 GPL,Linux版。(蓉,2005)今天才有如此多的要使 Linux 成為一個(gè)理想的操作系統(tǒng),是一項(xiàng)十分巨大的工程。Linus 認(rèn)識(shí)到單靠一個(gè)人的力量是的,它需要來(lái)自世界各地的編程共同努力。因此任何人想往內(nèi)核中加入新的特性,只要被認(rèn)為是有用的,合理的。Linus 就
12、允許加入。就這樣,Linux在來(lái)自世界各地的眾的共同協(xié)作下發(fā)展了起來(lái)。下面是Linux 發(fā)展過(guò)程中的重要里程碑。1990 年,Linus Torvalad 首次接觸Minix;1991 年,Linus Torvalad 開(kāi)始在Minix 上編寫(xiě)各種驅(qū)動(dòng)程序等操作系統(tǒng)內(nèi)核組件;1991 年,Linus Torvalad 公開(kāi)了Linux 內(nèi)核;1993 年,Linux 1.0 版,Linux 轉(zhuǎn)向 GPL協(xié)議;1994 年,Linux 的第一個(gè)商業(yè)版式Slackware 問(wèn)世;1996 年,IX 標(biāo)準(zhǔn);技術(shù)局的計(jì)算機(jī)系統(tǒng)確認(rèn) Linux 版本 1.2.13 符合1997 年,Linux 的簡(jiǎn)體中
13、文版相繼問(wèn)世;2001 年,Linux 2.4 版內(nèi)核發(fā)布;2003 年,Linux 2.6 版內(nèi)核發(fā)布;1.2 Linux 操作系統(tǒng)的特點(diǎn)Linux 作為一種流行的操作系統(tǒng),在市場(chǎng)上占有越來(lái)越大的份額,很多人特別是程序員紛紛轉(zhuǎn)向Linux,Linux 逐漸成為的一個(gè)強(qiáng)勁對(duì)手。Linux 是類(lèi) Unix 的實(shí)現(xiàn),具有強(qiáng)大的功能,很好地支持了各種現(xiàn)代編程技術(shù),具有以下主要特點(diǎn)。1.2.1開(kāi)放Linux 是一款免費(fèi)的操作系統(tǒng),用戶可以通過(guò)網(wǎng)絡(luò)或其他途徑免費(fèi)獲得,并可以任意修改其源代碼,這是其他的操作系統(tǒng)所做不到的。正是由于這一點(diǎn),來(lái)自全世界的無(wú)數(shù)程序員參與了Linux 的修改,編寫(xiě)工作,程序員可以
14、根據(jù)自己的和靈感對(duì)其進(jìn)行改變。這讓Linux 吸收了無(wú)數(shù)程序員的精華,不斷壯大。它開(kāi)放源碼并對(duì)外免費(fèi)提供,在ernet 上。者可以按照自己的需要修改,和發(fā)布程序的源碼,并(S.Balakrishnam,2003)1.2.2 真正的多任務(wù)多用戶Linux 充分利用了x86 CPU 的任務(wù)切換機(jī)制,實(shí)現(xiàn)了真正多任務(wù),多用戶環(huán)境,允許多個(gè)用戶同時(shí)執(zhí)行不同的程序,并且可以給緊急任務(wù)以較高的優(yōu)先級(jí)。多任務(wù)是現(xiàn)代主要的一個(gè)特點(diǎn),它指計(jì)算機(jī)同時(shí)執(zhí)行多個(gè)程序,而且各個(gè)程序的運(yùn)行互相獨(dú)立。Linux系統(tǒng)調(diào)度每一個(gè)進(jìn)程地使用CPU。由于CPU 的處理速度非常快,各個(gè)被啟動(dòng)執(zhí)行的程序看起來(lái)好像在并行運(yùn)行。事實(shí)上,從
15、 CPU 執(zhí)行一個(gè)程序中的一組指令到 Linux調(diào)度CPU 兩次運(yùn)行這個(gè)程序之間有很短的時(shí)間延遲,但用戶是感覺(jué)不到的。1.2.3 UNIX 的完整實(shí)現(xiàn)從發(fā)展的背景看,Linux 與其他操作系統(tǒng)有著明顯的區(qū)別。Linux 是從一個(gè)比較成操作系統(tǒng) Unix 發(fā)展而來(lái)的,Unix 上絕大多數(shù)命令都可以在Linux 里找到并有所加強(qiáng)??梢哉J(rèn)為它是 Unix 系統(tǒng)的一個(gè)變種,因而 Unix 的優(yōu)良特點(diǎn)(如可靠性,穩(wěn)定性,強(qiáng)大的網(wǎng)絡(luò)功能,強(qiáng)大的數(shù)據(jù)庫(kù)支持能力以及良好的開(kāi)放性等)都在 Linux 上一一體現(xiàn)出來(lái)。同時(shí)在 Linux 的發(fā)展過(guò)程中。Linux 的用戶能夠直接使用與 Unix 相關(guān)的支持和幫助。
16、1.2.4 完全符合IX 標(biāo)準(zhǔn)IX 是基于 Unix 的第一個(gè)操作系統(tǒng)簇國(guó)際標(biāo)準(zhǔn)。Linux 遵循這一標(biāo)準(zhǔn),使得 Unix下許多應(yīng)用程序可以很容易地移植到Linux 下,相反也是如此。Linux 完全兼容IX 1.0 標(biāo)準(zhǔn),可以在 Linux 下通過(guò)相應(yīng)的模擬器運(yùn)行常見(jiàn)的DOS,Windows 程序。這為用戶從Windows 轉(zhuǎn)到Linux 奠定了基礎(chǔ)。1.2.5 良好的用戶界面Linux 向用戶提供了兩種界面:用戶界面和系統(tǒng)調(diào)用。Linux 的傳統(tǒng)用戶界面是基于命令行的界面。即 Unix 系統(tǒng)的S存入文件后提交系統(tǒng)批量自動(dòng)執(zhí)行。S界面,它既可以聯(lián)機(jī)實(shí)時(shí)逐條輸入執(zhí)行,也可以有很強(qiáng)的設(shè)計(jì)能力,用
17、戶可以方便地用它編制程序,從而為用戶擴(kuò)充系統(tǒng)功能提供更高級(jí)段??删幊?S是指將多條命令組合在一起,形成一個(gè) S程序。這個(gè)程序可以單獨(dú)運(yùn)行,也可以與其他程序同時(shí)運(yùn)行。Linux 的系統(tǒng)調(diào)用界面是供用戶編程時(shí)使用的,用戶可以在編程時(shí)直接使用系統(tǒng)提供的系統(tǒng)調(diào)用命令。另外,Linux 通過(guò)使用鼠、菜單、窗口和滾動(dòng)條還為用戶提供了一個(gè)直觀,易操作及交互性強(qiáng)大的圖形化界面。1.2.6 強(qiáng)大的網(wǎng)絡(luò)功能互聯(lián)網(wǎng)是在 Unix 的基礎(chǔ)上繁榮起來(lái)的,Linux 的網(wǎng)絡(luò)功能當(dāng)然不會(huì)遜色。Linux 的網(wǎng)絡(luò)功能和其內(nèi)核緊密相連,在這方面Linux 要優(yōu)于其他操作系統(tǒng)。在Linux 中,用戶可以輕松實(shí)現(xiàn)網(wǎng)頁(yè)瀏覽,文件傳輸
18、,登錄等網(wǎng)絡(luò)工作。Linux 強(qiáng)大的網(wǎng)絡(luò)功能首先體現(xiàn)在對(duì)ernet 的使用的支持。Linux 免費(fèi)提供了大量支持ernet 的。用戶能夠用 Linux 與世界上其他人進(jìn)行通信。Linux 強(qiáng)大的網(wǎng)絡(luò)功能還體現(xiàn)在文件傳輸能力上。用戶能通過(guò)一些 Linux 命令完成信息或文件的傳輸。也是 Linux 系統(tǒng)提供的重要網(wǎng)絡(luò)功能,Linux 不僅允許通過(guò)網(wǎng)絡(luò)進(jìn)行廣播電臺(tái)程序的傳輸,還為系統(tǒng)管理員和技術(shù)提供了通過(guò)網(wǎng)絡(luò)其他系統(tǒng)的窗口。借助這各的能力,無(wú)論系統(tǒng)在地理上位于休息技術(shù)都能夠有效地為多個(gè)系統(tǒng)服務(wù)。(謝,2008)Linux 不僅能夠作為網(wǎng)絡(luò)工作站使用還可以作為服務(wù)器提供 WWW、FTP、等服務(wù)。1.
19、2.7 良好的可移植性可移植性是指將操作系統(tǒng)從一種計(jì)算機(jī)硬件轉(zhuǎn)移到另一種計(jì)算機(jī)硬件后,仍然能夠按其自身方式運(yùn)行的能力。Linux 是一種可移植的操作系統(tǒng),能夠在從微型到大型的任何環(huán)境和任何上運(yùn)行??梢浦残詾檫\(yùn)行 Linux 系統(tǒng)的計(jì)算機(jī)與其他計(jì),而不需要另外增加特殊的通口。Linux 可算機(jī)進(jìn)行準(zhǔn)確而有效的通信提供了以運(yùn)行在多種硬件上。如具有x86、680 x0、SPARC、ALPHA 等處理器的。同時(shí)Linux 還支持多處理器技術(shù)、多個(gè)處理器同時(shí)工作,從而使系統(tǒng)性能大大的提高。此外,Linux 還是一種操作系統(tǒng),可以運(yùn)行在掌上電腦、機(jī)頂盒或機(jī)上。2001年 1 月發(fā)布的 Linux 2.4
20、版內(nèi)核已經(jīng)能夠完全支持er64 位架構(gòu)。1.2.8 設(shè)備獨(dú)立性設(shè)備獨(dú)立性是指操作系統(tǒng)把所有外部設(shè)備當(dāng)作文件,只要安裝了它們的驅(qū)動(dòng)程序,任何用戶都可以像使用文件一樣,使用這些設(shè)備,而不必知道它們的具體形式設(shè)備獨(dú)立性的關(guān)鍵在于內(nèi)核的適應(yīng)能力。其他操作系統(tǒng)只允許一定數(shù)量或一定種類(lèi)的外部設(shè)備連接。而具有設(shè)備獨(dú)立性的操作系統(tǒng)能夠容納任意種類(lèi)及任意數(shù)量的設(shè)備,因?yàn)槊恳粋€(gè)設(shè)備老師通過(guò)與內(nèi)核的連接獨(dú)立進(jìn)行。Linux 量具有設(shè)備獨(dú)立性的操作系統(tǒng),它的內(nèi)核具有高度適應(yīng)能力。隨著的程序員加入Linux 編程,會(huì)胡硬件設(shè)備加入到各種Linux 內(nèi)核和版本中。別處,由于用戶可以到Linux 的內(nèi)核源代碼,因此用戶可以
21、修改內(nèi)核源代碼,以便適應(yīng)新增加的外部設(shè)備。第二章 QT 相關(guān)技術(shù)背景2.1 Qt 概述Qt 是Trolltech 公司的一個(gè)產(chǎn)品。Qt 是一個(gè)多的C+圖形用戶界面應(yīng)用程序框架。它提供給應(yīng)用程序開(kāi)發(fā)者建立圖形用戶界面應(yīng)用程序所需的所有功能。Qt 是完全面象的,它很容易擴(kuò)展,并且允許真正的組件編程。自從 1996 年早些時(shí)候,Qt 進(jìn)入商業(yè)領(lǐng)域,它已經(jīng)成為全世界范圍內(nèi)數(shù)千種成功的應(yīng)用程序的基礎(chǔ)。Qt 也是流行的Linux 桌面環(huán)境KDE 的基礎(chǔ)。(KDE 是所有主要的Linux版的一個(gè)標(biāo)準(zhǔn)組件)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 提供了一組范圍相當(dāng)廣泛的C+類(lèi)庫(kù),并包含了幾種命令行和圖形界面的工具,有效地使用這些工具可以加速開(kāi)發(fā)過(guò)程。主要組成部分如下所示。Qt Designer:Qt 設(shè)計(jì)器。用來(lái)可視化地設(shè)計(jì)應(yīng)用程序界面。Qt Linguist:Qt 語(yǔ)言學(xué)家。用來(lái)翻譯應(yīng)用程序。以此提供對(duì)多種語(yǔ)言的支持。Qmake:使用此工具可以由簡(jiǎn)單的、與Makefile。無(wú)關(guān)的工程文件來(lái)生成編譯所需的Qt Assi
23、stant:關(guān)于 Qt 的幫助文件。類(lèi)似于MSDN??梢钥焖俚匕l(fā)現(xiàn)你所需要的幫助。moc:元對(duì)象編譯器。uic:用戶界面編譯器。在程序編譯時(shí)被自動(dòng)調(diào)用,通過(guò) ui_*.h 文件生成應(yīng)用程序界面。qembed:轉(zhuǎn)換數(shù)據(jù),比如,將Linux 下 Qt 開(kāi)發(fā)環(huán)境搭建轉(zhuǎn)換為C+代碼。2.2 QT 發(fā)展歷史Qt 是一個(gè)跨的 C+ 圖形用戶界面庫(kù),由挪威 TrollTech 公司,目前包括 Qt, 基于 Framebuffer 的 Qt Embedded,快速開(kāi)發(fā)工具 Qt Designer,工具 QtLinguist 等部分 Qt支持所有 Unix,2008)系統(tǒng),當(dāng)然也包括 Linux,還支持 Win
24、NT/Win2k,Win95/98Trolltech。(公司在 1994 年成立,但是在 1992 年,成立 Trolltech 公司的那批程序員 就已經(jīng)開(kāi)始設(shè)計(jì) Qt 了,Qt 的第一個(gè)商業(yè)版本于 1995 年推出然后 Qt 的發(fā)展就很快了,下面是 Qt 發(fā)展史上的一些里程碑:1996 Oct KDE 組織成立1998 Apr 05 Trolltech 的程序員在 5天之內(nèi)將Netsc5.0從Motif移植到Qt上1998 Apr 08 KDE Free Qt1998 Jul 09 Qt 1.40 發(fā)布1998 Jul 12 KDE 1.0 發(fā)布1999 Mar 04 QPL 1.0 發(fā)布1
25、999 Mar 12 Qt 1.44 發(fā)布1999 Jun 25 Qt 2.0 發(fā)布1999 Sep 13 KDE 1.1.2 發(fā)布成立2000 Mar 20Qt 發(fā)布2000 Sep 06 Qt 2.2 發(fā)布2000 Oct 05 Qt 2.2.1 發(fā)布2000 Oct 30 Qt/Embedded 開(kāi)始使用 GPL2000 Sep 04 Qt free edition開(kāi)始使用 GPL2.3 QT 優(yōu)點(diǎn)基本上,Qt 同 X Window臺(tái)上的 MFC、OWL、VCL、上的 Motif、Openwin、GTK等圖形界面庫(kù)和 Windows是同類(lèi)型的東西,但是 Qt 具有下列優(yōu)點(diǎn)。優(yōu)良的跨特性Q
26、t 支持下列操作系統(tǒng):Windows 95/98、Windows NT、Linux、SolarinOS、HP-UX、DigitaIX (OSF/1, Tru64)、 Irix,F(xiàn)reeBSD、BSD/OS、SCO、AIX、 OS390、QNX 等等。面象Qt 的良好封裝機(jī)制使得 Qt 的模塊化程度非常高,可重用性較好,對(duì)于用戶開(kāi)發(fā)來(lái)說(shuō)是非常 方便的。 Qt 提供了一種稱為 signals/slots 的安全類(lèi)型來(lái)替callback,這使得各個(gè)元件之間的協(xié)同工作變得十分簡(jiǎn)單。豐富的 APIQt 包括多達(dá) 250 個(gè)以上的 C+ 類(lèi),還替供基于模板的 collectionsserializatio
27、n、 file、I/O device、 directory management、 date/time 類(lèi)。甚至還包括正則表達(dá)式的處理功能。(1)(2)(3)支持 2D/3D 圖形渲染,支持 OpenGL。大量的開(kāi)檔。XML 支持。2.4 KDE 和 GNOME但是真正使得 Qt 在界的眾多 Widgets(如 Lesstif、Gtk、EZWGL、Xforms、fltk 等等)中脫穎而出的還是基于 Qt 的重量級(jí)Trolltech 公司承受巨大壓力的一個(gè)原因。下面- KDE/QT .VS. Gnome/Gtk 是怎么發(fā)生的。KDE。 有趣的是,KDE 也是使得來(lái)看看這場(chǎng)著名的在 Unix 的圖
28、形界面一向是以 MIT 的 X Window 系統(tǒng)為標(biāo)準(zhǔn),在商業(yè)應(yīng)用上有兩大流派,一派是以 Sun 公司的 Openlook 陣營(yíng),一派是 IBM/HP的OSF (Open Software Foundation) 的 Motif, 雙方經(jīng)過(guò)多年競(jìng)爭(zhēng)之后, Motif 最終勝出,成為最普遍使用的界面庫(kù),后來(lái)雙方又妥協(xié)出一個(gè) CDE(Common Desktop Enviroment)作為一個(gè)標(biāo)準(zhǔn)的圖形界面。但是 Motif/CDER 的價(jià)格非常昂貴,在這同時(shí)微軟的 Windows 圖形界面發(fā)展速度非???,而 Unix 界的后起之秀 Linux 也急需一個(gè)可靠并且免費(fèi)的圖形界面1。1996 年
29、10 月,由開(kāi)發(fā)圖形排版工具 Lyx 的德國(guó)人 Matthias Ettrich 發(fā)起了 KDE 計(jì)劃。 KDE用 GPL的全稱為 K Desktop Environment,可以看出是針對(duì) CDE。KDE 本身 是采的,但是 KDE 卻是使用 Qt 來(lái)作為其底層庫(kù),因?yàn)楫?dāng)時(shí) Qt 已經(jīng)將其Unix 版本發(fā)布了,但是 Qt 并不遵循 GPL, 因此 KDE 被很多的作者,認(rèn)為利用非開(kāi)發(fā)違背了 GPL 的精神,于是 GNU 的狂熱信徒兵分兩路,一路是去制作 Harmonny,試圖重寫(xiě)一套兼容于 Qt 的替代品,另一路是由一個(gè) 26歲的墨西哥程序員 Miguel De Icaza下重新開(kāi)發(fā)一套叫
30、GNOME(GNU NetworkObject Enviroment)來(lái)替代由于 Linux 界的了幾個(gè)全職程序員來(lái)加入KDE。RedHat 不喜歡 KDE/Qt 的,因此RedHat 甚至專(zhuān)門(mén)派出Motif VS Openlook 相GNOME 進(jìn)行開(kāi)發(fā)工作,于是一場(chǎng)同似的就這么打起來(lái)了。Trolltech 為了 KDE 曾數(shù)次修改 Qt,從成立 KDE的Free Qt到采用 QPL,可謂是費(fèi)盡心機(jī),但是 GNOME 采用的 GTK 一開(kāi)始就是完全的 GPL,因此在這個(gè)方 面 GNOME 有一定的優(yōu)勢(shì),加上 Qt/KDE 采用 C+ 開(kāi)發(fā),入門(mén)的門(mén)檻比較高,而 GTK/Gnome 采用 C,
31、 因此 GNOME 吸引了的開(kāi)發(fā)者,但是 KDE 畢竟先走了一步, 推出的 KDE1.1.2 十分穩(wěn)定, 而當(dāng)時(shí)急忙中推出的 GNOME1.0 的系統(tǒng)穩(wěn)定性奇差,有人甚至笑稱 GNOME1.0 還沒(méi)有 KDE 1.0 Alpha 穩(wěn)定。但是 GNOME 后來(lái)發(fā)展比較快,大有迎頭趕上的勢(shì)頭。當(dāng)時(shí)雙方的開(kāi)發(fā)者在網(wǎng)絡(luò) 上炒得天翻地覆,連 Linux 之父 Linus 只是說(shuō)了一句喜歡用 KDE 都倍受指責(zé)。到了第三個(gè)年頭,也就是 2000 年,可謂是風(fēng)云突變,一個(gè)接一個(gè)的事件先后發(fā)生:首先是一批從 Apple 公司出來(lái)的工程師成立了一個(gè)叫 Eazel 的公司替GNOME GNOME為龐大的設(shè)計(jì)界面,
32、然后是一批 GNOME 程序員成立了一個(gè) Helix Code 公司替提供商業(yè)支持,而大家期待以久的 KDE 2.0 也終于發(fā)布了,這恐怕是目前最了之一, 除了 KDE 本身,還包括 Koffice 套件,Kdevelop 等等大批,其主力Kounqueror 也是第一個(gè)可以同微軟的ernet Exploer 相抗衡的瀏覽器。 而 Sun一個(gè) GNOME公司,Red Hat 公司, Eazel 公司,Helix Code 等一批公司成立了,Sun 還宣布將把重量級(jí)辦公Star office 同 GNOME 集成,Trolltech 公司自然不能坐以待斃,于今年 10 月 4 日將 Qt 的 f
33、ree edition 變?yōu)?GPL 宣言,徹底解決了 KDE 的力的回?fù)?。到現(xiàn)在為止,這場(chǎng)問(wèn)題,又推出了Qt ,給了 GNOME 陣營(yíng)一個(gè)有不能很快看到結(jié)果。一般說(shuō)來(lái),還在繼續(xù),相信目前 GNOME 吸引的公司比較多,但是 KDE/Qt的開(kāi)發(fā)的效率和質(zhì)量比 GNOME高,而且在 Office/環(huán)境中先走一步,在一定時(shí)間內(nèi)還將處于優(yōu)勢(shì)地位。(W.RichardStevens,Stephen A.Rago,2003)2.5 QT 的安裝一般來(lái)說(shuō),居于 Qt/Embedded 開(kāi)發(fā)的應(yīng)用程序最終會(huì)發(fā)布到安裝有Linux 操作系統(tǒng)的小型設(shè)備上,所以使用裝有 Linux 操作系統(tǒng)的 PC 或工作站來(lái)完
34、成 Qt/Embedded 開(kāi)發(fā)是最理想的環(huán)境,當(dāng)然它也可以安裝在 UNIX 和 Windows 系統(tǒng)上。在一臺(tái)裝有Linux 操作系統(tǒng)的機(jī)器上建立 Qt/Embedded 開(kāi)發(fā)環(huán)境,首先需要準(zhǔn)備安裝包:tmake 工具安裝包、Qt/Embedded 安裝包和 Qt 的 X11 版的安裝包。這些可以免費(fèi)從Trolltech 的 Web 或FTP 服務(wù)器上。其中各安裝包的主要作用是 tmake 1.11或更高版本生成 Qt/Embedded 應(yīng)用工程的 Makefile 文件; Qt/Embedded 2.3.7 是Qt/Embedded 的安裝包;Qt 2.3.2 for X11 將產(chǎn)生x11
35、 開(kāi)發(fā)環(huán)境所需要的兩個(gè)工具2。由于安裝包有許多不同版本,版本不同在使用時(shí)將造成。所以在使用時(shí)要注意一下安裝原則:選擇或了 Qt/Embedded 的某個(gè)版本的安裝包之后,下一步選擇安裝的Qt for X11 的安裝包的版本必須比最先的Qt/Embedded 的版本舊,這是因?yàn)镼t forX11 的安裝包的兩個(gè)工具 uic 和 designer 產(chǎn)生的源文件會(huì)和 Qt/Embedded 的庫(kù)一起被編譯,本著“向前兼容”的原則,Qt for X11 的版本應(yīng)比 Qt/Embedded 的版本舊。1、安裝tmake在Linux 命令模式下運(yùn)行以下命令: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 命令模式下運(yùn)行以下命令: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 位的顯示顏色深度?!癿ake sub-src”指定按精簡(jiǎn)方式編譯開(kāi)發(fā)包。Qt開(kāi)發(fā)包生成虛擬緩沖幀開(kāi)發(fā)包有 5 種編譯范圍的選項(xiàng),使用這些選項(xiàng)可控制 Qt 生成的庫(kù)文件的大小,編譯選項(xiàng)的具體用法運(yùn)行“./configure-help”查看。3、安裝 Qt/X11 2.3.2在Linux 命令行模式下運(yùn)行以下命令: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 .根據(jù)開(kāi)發(fā)環(huán)境可在configure 的參數(shù)中添加別的參數(shù),可鍵入“./configure -help”來(lái)查看。2.6 QT 信號(hào)與槽機(jī)制信號(hào)和槽機(jī)制是 QT 的機(jī)制,要精通 QT 編程就必須對(duì)信號(hào)和槽有所了解。信號(hào)和槽是一種高級(jí)接口
39、,應(yīng)用于對(duì)象之間的通信,它是 QT 的特性,也是 QT 區(qū)別于其它工具包的重要地方。信號(hào)和槽是 QT 自行定義的一種通信機(jī)制,它獨(dú)立于標(biāo)準(zhǔn)的C/C+語(yǔ)言,因此要正確的處理信號(hào)和槽,必須借助一個(gè)稱為 moc(Meta Object Compiler)的 QT 工具,該工具是一個(gè) C+預(yù)處理程序,它為附加代碼。次的事件處理自動(dòng)生成所需要的在所熟知的很多 GUI 工具包中,窗口小(widget)都有一個(gè)回調(diào)函數(shù)用于響應(yīng)它們能觸發(fā)的每個(gè)動(dòng)作,這個(gè)回調(diào)函數(shù)通常是一個(gè)指向某個(gè)函數(shù)的指針。但是,在QT 中信號(hào)和槽取代了這些凌亂的函數(shù)指針,使得編寫(xiě)這些通信程序更為簡(jiǎn)潔明了。信號(hào)和槽能攜帶任意數(shù)量和任意類(lèi)型的參
40、數(shù),他們是類(lèi)型完全安全的,不會(huì)像回調(diào)函數(shù)那樣產(chǎn)生core dumps。所有從 QObject 或其子類(lèi)(例如 Qwidget)派生的類(lèi)都能夠包含信號(hào)和槽。當(dāng)對(duì)象改變其狀態(tài)時(shí),信號(hào)就由該對(duì)象發(fā)射(emit)出去,這就是對(duì)象所要做的全部事情,它不知道另一端是誰(shuí)在接收這個(gè)信號(hào)。這就是真正的信息封裝,它確保對(duì)象被當(dāng)作一個(gè)真正的組件來(lái)使用。槽用于接收信號(hào),但它們是普通的對(duì)象成員函數(shù)。一個(gè)槽并不知道是否有任何信號(hào)與自己相連接。而且,對(duì)象并不了解具體的通信機(jī)制。(trolltech,2005)你可以將很多信號(hào)與單個(gè)的槽進(jìn)行連接,也可以將單個(gè)的信號(hào)與很多的槽進(jìn)行連接,甚至于將一個(gè)信號(hào)與另外一個(gè)信號(hào)相連接也是可
41、能的,這時(shí)無(wú)論第一個(gè)信號(hào)什么時(shí)候發(fā)射系統(tǒng)都將立刻發(fā)射第二個(gè)信號(hào)??傊盘?hào)與槽構(gòu)造了一個(gè)強(qiáng)大的編程機(jī)制。(Jasmin Blanchette,1998)當(dāng)某個(gè)信號(hào)對(duì)其客戶或所有者發(fā)生的狀態(tài)發(fā)生改變,信號(hào)被一個(gè)對(duì)象發(fā)射。只有 定義過(guò)這個(gè)信號(hào)的類(lèi)及其派生類(lèi)能夠發(fā)射這個(gè)信號(hào)。當(dāng)一個(gè)信號(hào)被發(fā)射時(shí),與其相關(guān)聯(lián)的槽將被立刻執(zhí)行,就象一個(gè)正常的函數(shù)調(diào)用一樣。信號(hào)-槽機(jī)制完全獨(dú)立于任何GUI 事件循環(huán)。只有當(dāng)所有的槽返回以后發(fā)射函數(shù)(emit)才返回。 如果存在多個(gè)槽與某個(gè)信號(hào)相關(guān)聯(lián),那么,當(dāng)這個(gè)信號(hào)被發(fā)射時(shí),這些槽將會(huì)一個(gè)接一個(gè)地執(zhí)行,但是它們執(zhí)行的順序?qū)?huì)是隨機(jī)的、不確定的,不能人為地指定哪個(gè)先執(zhí)行、哪個(gè)
42、后執(zhí)行。信號(hào)的是在頭文件中進(jìn)行的,QT 的signals 關(guān)鍵字進(jìn)入了信號(hào)區(qū),隨后即可自己的信號(hào)。槽是普通的C+成員函數(shù),可以被正常調(diào)用,它們唯一的特殊性就是很多信號(hào)可以與其相關(guān)聯(lián)。當(dāng)與其關(guān)聯(lián)的信號(hào)被發(fā)射時(shí),這個(gè)槽就會(huì)被調(diào)用。槽可以有參數(shù),但槽的參數(shù)不能有缺省值。既然槽是普通的成員函數(shù),因此與其它的函數(shù)一樣,它們也有存取權(quán)限。槽的存取權(quán)限決定了誰(shuí)能夠與其相關(guān)聯(lián)。同普通的C+成員函數(shù)一樣,槽函數(shù)也分為三種類(lèi)型,即public slots、private slots 和protected slots。public slots:在這個(gè)區(qū)內(nèi)的槽意味著任何對(duì)象都可將信號(hào)與之相連接。這對(duì)于組件編程非常有用
43、,你可以創(chuàng)建彼此互不了解的對(duì)象,將它們的信號(hào)與槽進(jìn)行連接以便信息能夠正確的傳遞。protected slots:在這個(gè)區(qū)內(nèi)的槽意味著當(dāng)前類(lèi)及其子類(lèi)可以將信號(hào)與之相連接。這適用于那些槽,它們是類(lèi)實(shí)現(xiàn)的一部分,但是其界面接口卻面向外部。private slots:在這個(gè)區(qū)內(nèi)用于聯(lián)系非常緊密的類(lèi)。的槽意味著只有類(lèi)自己可以將信號(hào)與之相連接。這適槽也能夠?yàn)樘摵瘮?shù),這也是非常有用的。槽的也是在頭文件中進(jìn)行的。通過(guò)調(diào)用 QObject 對(duì)象的 connect 函數(shù)來(lái)將某個(gè)對(duì)象的信號(hào)與另外一個(gè)對(duì)象的槽函數(shù)相關(guān)聯(lián),這樣當(dāng)發(fā)射者發(fā)射信號(hào)時(shí),接收者的槽函數(shù)將被調(diào)用。該函數(shù)的定義如下:bool QObject:con
44、nect ( const QObject * sender, const char * signal, const QObject * receiver, const char * member ) sic 。這個(gè)函數(shù)的作用就是將發(fā)射者 sender 對(duì)象中的信號(hào) signal 與接收者 receiver 中的member 槽函數(shù)聯(lián)系起來(lái)。當(dāng)指定信號(hào) signal 時(shí)必須使用 QT 的宏SIGNAL(),當(dāng)指定槽函數(shù)時(shí)必須使用宏SLOT()。如果發(fā)射者與接收者屬于同一個(gè)對(duì)象的話,那么在 connect調(diào)用中接收者參數(shù)可以省略。元對(duì)象編譯器 moc(meta object compiler)對(duì)
45、C+文件中的類(lèi)進(jìn)行分析并產(chǎn)生用于初始化元的C+代碼,元對(duì)象包含全部信號(hào)和槽的名字以及指向這些函數(shù)的指針。moc 讀C+源文件,如果發(fā)現(xiàn)有 Q_OBJECT 宏的類(lèi),它就會(huì)生成另外一個(gè) C+源文件,這個(gè)新生成的文件中包含有該類(lèi)的元對(duì)象代碼。例如,假設(shè)有一個(gè)頭文件mysignal.h,在這個(gè)文件中包含有信號(hào)或槽的,那么在編譯之前 moc 工具就會(huì)根據(jù)該文件自動(dòng)生成一個(gè)名為mysignal.moc.h 的C+源文件并將其提交給編譯器;類(lèi)似地,對(duì)應(yīng)于mysignal.cpp 文件moc 工具將自動(dòng)生成一個(gè)名為mysignal.mo譯器3。p 文件提交給編元對(duì)象代碼是signal/slot 機(jī)制所必須的
46、。用 moc 產(chǎn)生的 C+源文件必須與類(lèi)實(shí)現(xiàn)一起進(jìn)行編譯和連接,或者用#include 語(yǔ)句將其包含到類(lèi)的源文件中。moc 并不擴(kuò)展#include 或者#define 宏定義,它只是簡(jiǎn)單的跳過(guò)所遇到的任何預(yù)處理指令。一個(gè)小例子一個(gè)最小的C+類(lèi) class Foopublic:Foo ();如下:value () const return val ;void setValue ( private:val;);一個(gè)小的 Qt 類(lèi)如下:Class Foo: public QObject Q_OBJECTPublic:Foo ();value () const return val ; public
47、 slots:void setValue(signals:);void valueChanged (); private:val;這個(gè)類(lèi)有同樣的狀態(tài),和公有方法狀態(tài),但是另外它也支持使用信號(hào)和槽的組件編程:這個(gè)類(lèi)可以通過(guò)發(fā)射一個(gè)信號(hào):valueChanged()來(lái)告訴外界它的狀態(tài)發(fā)生了變化,并且它有一個(gè)槽,其它對(duì)象可以發(fā)送信號(hào)給這個(gè)槽。所有包含信號(hào)和/或者槽的類(lèi)必須在它們的中提到 Q_OBJECT4。槽可以由應(yīng)用程序的編寫(xiě)者來(lái)實(shí)現(xiàn)。這里是Foo:setValue()一個(gè)可能的實(shí)現(xiàn):Void Foo:setValue (if (v != val) val = v;v)emit valueChan
48、ged (v);emit valueChanged(v)這一行從對(duì)象中發(fā)射valueChanged 信號(hào)。正如你所能看到的,你通過(guò)使用emit signal(arguments)來(lái)發(fā)射信號(hào)。下面是把兩個(gè)對(duì)象連接在一起的法: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調(diào)用a.setValue(79)會(huì)使 a 發(fā)射一個(gè)valueChanged(
49、) 信號(hào),b 將會(huì)在它的 setValue()槽中接收這個(gè)信號(hào),也就是 b.setValue(79) 被調(diào)用。接下來(lái) b 會(huì)發(fā)射同樣的 valueChanged()信號(hào),但是因?yàn)闆](méi)有槽被連接到b 的valueChanged()信號(hào),所以沒(méi)有發(fā)生任何事(信號(hào)了)。注意:只有當(dāng) v != val 的時(shí)候 setValue()函數(shù)才會(huì)設(shè)置這個(gè)值并且發(fā)射信號(hào)。這樣就避免了在循環(huán)連接的情況下(比如 b.valueChanged() 和 a.setValue()連接在一起)出現(xiàn)無(wú)休止的循環(huán)的情況。這個(gè)例子說(shuō)明了對(duì)象之間可以在互相不知道的情況下一起工作,只要在最初的時(shí)在它們中間建立連接。預(yù)處理程序改變或者移
50、除了 signals、slots 和emit 這些關(guān)鍵字,這樣就可以使用標(biāo)準(zhǔn)的C+編譯器。在一個(gè)定義有信號(hào)和槽的類(lèi)上運(yùn)行moc。這樣就會(huì)生成一個(gè)可以和其它對(duì)象文件編譯和連接成程序的C+源文件。2.7 元對(duì)象系統(tǒng)(Meta-Object System)Qt 的一個(gè)最主要的特點(diǎn)可能就是它擴(kuò)展了C+的機(jī)制,可以創(chuàng)建獨(dú)立的這些組件可以被綁定在一起,而不需要互相的任何了解。組件,這個(gè)機(jī)制被成為元對(duì)象系統(tǒng),它提供了兩個(gè)關(guān)鍵服務(wù):信號(hào)/槽、運(yùn)行時(shí)的類(lèi)型信息和動(dòng)態(tài)屬性系統(tǒng)(內(nèi)省機(jī)制)。內(nèi)省機(jī)制對(duì)于實(shí)現(xiàn)信號(hào)和槽是必須的,并且允許應(yīng)用程序員在程序運(yùn)行時(shí)獲得“元信息”(包括被對(duì)象支持的信號(hào)和槽的列表,以及這些信號(hào)/
51、槽所在的類(lèi)的名稱)。內(nèi)省機(jī)制同時(shí)支持“”(對(duì)于 Qt Designer)和文本翻譯(國(guó)際化),它還是 Qt 應(yīng)用程序(Qt Script for Application)的基礎(chǔ)。標(biāo)準(zhǔn)的C+并不提供對(duì)于 Qt 的元對(duì)象系統(tǒng)所需要的動(dòng)態(tài)元信息的支持。Qt 提供了一個(gè)單獨(dú)的工具:元對(duì)象編譯器(moc)來(lái)解決這個(gè)問(wèn)題。Moc 用來(lái)Q_OBJECT類(lèi)的定義,使這些信息在 C+函數(shù)中可用。由于 moc 使用純粹的 C+函數(shù)來(lái)實(shí)現(xiàn),所以 Qt 的元對(duì)象系統(tǒng)在任何 C+編譯器下都可以工作。元對(duì)象系統(tǒng)這樣工作:Q_OBJECT 宏一些內(nèi)省函數(shù)(metaObject(),TR(),qt_mall()和少量其他的函
52、數(shù))。這些函數(shù)必須在所有的 QObject 的子類(lèi)中被實(shí)現(xiàn)。Qt 的moc 工具負(fù)責(zé)執(zhí)行被 Q_OBJECT 宏的函數(shù),同時(shí)負(fù)責(zé)執(zhí)行所有的信號(hào)函數(shù)。QObject 的成員函數(shù),例如connect()和disconnect(),使用內(nèi)省函數(shù)來(lái)工作。元對(duì)象系統(tǒng)基于以下三類(lèi):1)、QOBJECT 類(lèi);2)、類(lèi)中的私有段的 Q_OBJECT 宏;3)、元對(duì)象編譯器。MocC+源文件。如果它發(fā)現(xiàn)其中包含一個(gè)或多個(gè)類(lèi)的中含有 Q_OBJECT宏,它就會(huì)給含有 Q_OBJECT 宏的類(lèi)生成另一個(gè)含有元對(duì)象代碼的 C+源文件。這個(gè)生成的源文件可以被類(lèi)的源文件包含(#include)到或者和這個(gè)類(lèi)的實(shí)現(xiàn)一起編譯
53、和連接5。除了提供對(duì)象間通訊的信號(hào)和槽機(jī)制之外(這也是介紹這個(gè)系統(tǒng)的主要原因),QObject 中的元對(duì)象代碼也實(shí)現(xiàn)其它特征:1)、claame()函數(shù)在運(yùn)行的時(shí)候以字符串返回類(lèi)的名稱,不需要 C+編譯器中的運(yùn)行時(shí)刻類(lèi)型識(shí)別(RTTI)的支持。2)、inherits()函數(shù)返回這個(gè)對(duì)象是否是一個(gè)繼承于 QObject 繼承樹(shù)中一個(gè)特定類(lèi)的類(lèi)的實(shí)例。3)、tr()和 trUtf8()兩個(gè)函數(shù)是用于的字符串翻譯。4)、setPorperty()和 property()兩個(gè)函數(shù)是用來(lái)通過(guò)名稱動(dòng)態(tài)設(shè)置和獲得對(duì)象屬性的。 5)、metaObject()函數(shù)返回這個(gè)類(lèi)所關(guān)聯(lián)的元對(duì)象。雖然使用 QObjec
54、t 作為一個(gè)基類(lèi)而不使用 Q_OBJECT 宏和元對(duì)象代碼是可以的,但是如果 Q_OBJECT 宏沒(méi)有被使用,那么這里的信號(hào)和槽以及其它特征描述都不會(huì)被提供。根據(jù)元對(duì)象系統(tǒng)的觀點(diǎn),一個(gè)沒(méi)有元代碼的 QObject 的子類(lèi)和它含有元對(duì)象代碼的最近的祖先相同。舉例來(lái)說(shuō)就是,claame()將不會(huì)返回你的類(lèi)的實(shí)際名稱,返回的是它的這個(gè)祖先的名稱。強(qiáng)烈建議 QObject 的所有子類(lèi)使用 Q_OBJECT 宏,而不管它們是否實(shí)際使用了信號(hào)、槽和屬性。第三章 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)3.1 需求分析系統(tǒng)設(shè)計(jì)準(zhǔn)備工作如下所示。(1)Qt Designer 是設(shè)計(jì)窗口組件(Widget)的應(yīng)用程序,在安裝 Qt 的b
55、in 目錄下鍵入./designer,將啟動(dòng)一個(gè)包含很多 Qt 組件的可視化界面。在此組織應(yīng)用程序的各組件分布很方便,最后可生成一個(gè)file.ui 和main.cpp 文件;file.ui 是用 XML 語(yǔ)言寫(xiě)的一個(gè)文本6。(2)Uic(Usererface Compiler)是從 XML 文件生成代碼的用戶界面編譯器,用來(lái)將file.ui 文件生成file.h 和file.cpp 文件(命令如:uic -o file.h file.ui uic -o file.cpp -i file.h file.ui),但生成的這兩個(gè)文件不是標(biāo)準(zhǔn)的純 C+代碼.通常稱為 Qt 的 c+擴(kuò)展.因?yàn)?Qt的對(duì)
56、象問(wèn)中運(yùn)用了信號(hào)/槽的通信機(jī)制,在文件中用 Q_OBJECT 宏來(lái)標(biāo)識(shí)。(3)用 qmake 工具生成 文件,在設(shè)置好環(huán)境變量后,用 tmake 工具生成Makefile 文件(tmake 是跨Makefile);不管在Pc 環(huán)境、Qt/Embedded 環(huán)境還是交叉編譯環(huán)境中都能生成相應(yīng)的Makefile 文件。(4)moc(元對(duì)象編譯器)用來(lái)一個(gè)C+文件中的類(lèi)并且生成初始化對(duì)象的c+代碼,moc 在c+源文件,如果發(fā)現(xiàn)其中一個(gè)或多個(gè)類(lèi)的中含有 Q_OBJECT宏,就給出這個(gè)使用 Q_OBJECT 宏的類(lèi)生成另外一個(gè)包含元對(duì)象代碼的C+元文件;元對(duì)象代碼對(duì)信號(hào)/槽機(jī)制、運(yùn)行時(shí)類(lèi)型信息和動(dòng)態(tài)屬
57、性系統(tǒng)是需要的7。(5)用 make 命令生成可執(zhí)行的二進(jìn)制代碼文件;由于使用 tmake 生成 Makefile 文件,當(dāng)需要的時(shí)候,編譯規(guī)則中包含調(diào)用 moc(元對(duì)象編輯器),自動(dòng)地被連編系統(tǒng)調(diào)用,不需要手工調(diào)用。由于是用程序?qū)崿F(xiàn)界面的設(shè)計(jì),而不是用 QT 設(shè)計(jì)器,所以在程序里必須用 QT 語(yǔ)言設(shè)計(jì)cnt 客戶端和server 服務(wù)端的界面;客戶端的程序主要是實(shí)現(xiàn)客戶端界面設(shè)計(jì)、創(chuàng)建socket 以及連接各種各樣的信號(hào)界面上各種按鍵的功能。服務(wù)端的額程序是主要實(shí)現(xiàn)處理客戶端的請(qǐng)求、處理服務(wù)器新的連接和為服務(wù)器提供一個(gè) GUI 界面。輸入的形式和輸入值的范圍用鍵盤(pán)輸入數(shù)據(jù),并且數(shù)據(jù)必須是在
58、0 到 9 的范圍內(nèi)的整數(shù)。輸出的形式當(dāng)輸入時(shí) 0 到 9 內(nèi)的任何一個(gè)整數(shù)時(shí),如果與事先隨機(jī)產(chǎn)生的數(shù)字相等,則提示用戶猜對(duì)了。否則,提示錯(cuò)誤并把正確數(shù)字發(fā)送給客戶顯示出來(lái)。當(dāng)輸入的是字符或空格時(shí),將提示輸入 0 到 9 范圍內(nèi)的數(shù)字。3.2 系統(tǒng)功能設(shè)計(jì)啟動(dòng)N端為 4800 且IP 為服務(wù)器的 IP?Y范N圖 3.1 客戶端業(yè)務(wù)流程圖輸入數(shù)據(jù)位 0-9圍內(nèi)的整數(shù)?Y輸入的數(shù)與隨機(jī)產(chǎn)生的數(shù)相等?Y提示正確N提示輸入正確的數(shù)提示錯(cuò)誤,并輸出正確連接失敗啟動(dòng)N客戶端連接上服務(wù)端?Y關(guān)閉圖 3.2服務(wù)器端業(yè)務(wù)流程圖圖 3.3 通信機(jī)制原理圖3.3 主要的類(lèi)及抽象數(shù)據(jù)類(lèi)型的定義CntSocket 類(lèi):
59、定義CntSocket 類(lèi)公有繼承 QSocket,服務(wù)器與客戶端建立連接后,服務(wù)器創(chuàng)建一個(gè)CntSocket 來(lái)處理請(qǐng)求。沒(méi)有任何顯示顯示新連接SimpleServer 類(lèi):定義SimpleServer 類(lèi)公有繼承 QServerSocket,SimpleServer 類(lèi)用來(lái)處理服務(wù)器新的連接,對(duì)于每一個(gè)客戶端的連接,它都創(chuàng)建一個(gè)新的 C ntSocket, SimpleServer 用來(lái)處理與客戶端的聯(lián)系。ServerInfo 類(lèi):定義 ServerInfo 類(lèi)公有繼承 QVBox,為服務(wù)器提供一個(gè) GUI 界面8。QserverSocket 類(lèi): QServerSocket 是 serv
60、er socket 的一個(gè)封裝。QServerSocket 是一個(gè)基于 TCP/IP 的服務(wù)器類(lèi),它能建立服務(wù)器狀態(tài),當(dāng)有到請(qǐng)求后,就會(huì)建立其一個(gè)處理連接的socket 來(lái),因此,在服務(wù)器端,需要同時(shí)使用 QSocket, QServerSocket類(lèi)9。Qsocket 類(lèi) :QSocket 類(lèi)提供了一個(gè)有緩沖的TCP 連接,在這個(gè)類(lèi)中,可以調(diào)用的connectToHost()、bytesAvailable()、canReadLine()這些函數(shù)。connectToHost()是一個(gè)最常用的函數(shù),打開(kāi)一個(gè)被命名的主機(jī)的連接。當(dāng) connectToHost()已經(jīng)完成它的 DNS 查找并且正在開(kāi)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025企業(yè)辦公租賃合同模板【標(biāo)準(zhǔn)】
- 部門(mén)承包合同二零二五年
- 2025年耐磨球段項(xiàng)目發(fā)展計(jì)劃
- 勞務(wù)分包單位中途退場(chǎng)協(xié)議書(shū)
- 保護(hù)膜合同樣本
- 簡(jiǎn)易鐵棚安裝合同范例二零二五年
- 二零二五版論行政合同中的行政主體優(yōu)先權(quán)
- 二零二五定制品銷(xiāo)售合同范例
- 個(gè)人服務(wù)設(shè)計(jì)合同樣本
- 二零二五工人工資協(xié)議書(shū)模板
- 專(zhuān)題08 八年級(jí)下冊(cè)易混易錯(cuò)總結(jié)-備戰(zhàn)2024年中考道德與法治一輪復(fù)習(xí)知識(shí)清單(全國(guó)通用)
- 浙江宇翔職業(yè)技術(shù)學(xué)院?jiǎn)握新殰y(cè)參考試題庫(kù)(含答案)
- 提高手衛(wèi)生正確率品管圈課件
- 醫(yī)院勞務(wù)派遣投標(biāo)方案(技術(shù)方案)
- 高中數(shù)學(xué)開(kāi)放題賞析
- 非工傷人道主義賠償協(xié)議(標(biāo)準(zhǔn)版)
- 中華民族的復(fù)興
- 品質(zhì)部工作計(jì)劃
- 《浙江省工業(yè)建設(shè)項(xiàng)目用地控制指標(biāo)》(修訂)
- 【區(qū)域地理】《日本》【公開(kāi)課教學(xué)PPT課件】高中地理
- 配對(duì)齒輪參數(shù)全程計(jì)算(史上最全最好用的齒輪計(jì)算表格)
評(píng)論
0/150
提交評(píng)論