基于qt的局域網(wǎng)跨平臺(tái)即時(shí)通信軟件 畢業(yè)論文_第1頁
已閱讀1頁,還剩53頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  圈圈通信</b></p><p>  ——基于QT的局域網(wǎng)跨平臺(tái)即時(shí)通信軟件的設(shè)計(jì)與實(shí)現(xiàn)</p><p>  Circle Communication</p><p>  ——Based QT LAN cross-platform instant messaging software designAnd Impl

2、ementation</p><p><b>  目 錄</b></p><p><b>  1 引言1</b></p><p>  1.1 設(shè)計(jì)的目的及意義1</p><p>  1.2 開發(fā)背景2</p><p>  2 開發(fā)技術(shù)簡(jiǎn)介3</p>

3、<p>  2.1 開發(fā)工具簡(jiǎn)介3</p><p>  2.2開發(fā)技術(shù)簡(jiǎn)介4</p><p><b>  3 需求分析10</b></p><p>  3.1 功能需求分析10</p><p>  3.2 數(shù)據(jù)需求分析11</p><p>  3.3 技術(shù)需求分析12<

4、;/p><p>  3.4 性能需求分析12</p><p>  3.4 編寫環(huán)境需求分析12</p><p>  4 軟件設(shè)計(jì)與代碼分析13</p><p>  4.1 軟件結(jié)構(gòu)設(shè)計(jì)13</p><p>  4.2 各模塊功能流程圖及聯(lián)系14</p><p>  4.3 各模塊功能具體設(shè)

5、計(jì)與代碼實(shí)現(xiàn)22</p><p><b>  5 軟件測(cè)試37</b></p><p>  5.1 模塊測(cè)試37</p><p>  5.2 功能測(cè)試38</p><p>  5.3 測(cè)試結(jié)果39</p><p><b>  6 結(jié)束語47</b></p&g

6、t;<p><b>  參考文獻(xiàn)48</b></p><p><b>  致謝49</b></p><p><b>  Contents</b></p><p>  1 Introduction1</p><p>  1.1 The Purpose And

7、Significance Of Design1</p><p>  1.2 Background of Development2</p><p>  2 Development Of Technical Brief3</p><p>  2.1 Development Tool Profile3</p><p>  2.2 Devel

8、opment Of Technical Brief4</p><p>  3 Demand Analysis10</p><p>  3.1 Functional Requirements Analysis10</p><p>  3.2 Analysis Of Data Needs11</p><p>  3.3 Technical

9、 Requirement Analysis12</p><p>  3.4 Performance Needs Analysis12</p><p>  3.4 Authoring Environment Needs Analysis12</p><p>  4 Software Design And Code Analysis13</p>&

10、lt;p>  4.1 Software Architecture Design13</p><p>  4.2 Functions Of Each Module Flowchart And Contact14</p><p>  4.3 The Specific Design Of Each Module And Code Implementation23</p>

11、<p>  5 Software Testing38</p><p>  5.1 Module Testing38</p><p>  5.2 Functional Testing38</p><p>  5.3 Test Results39</p><p>  6 Conclusion47</p><

12、;p>  References48</p><p>  Acknowledgements49</p><p><b>  圈圈通信</b></p><p>  ——基于QT的局域網(wǎng)即時(shí)通信軟件的設(shè)計(jì)與實(shí)現(xiàn)</p><p>  ********* *******</p><p>  

13、******* ******</p><p>  【摘要】圈圈通信是面向局域網(wǎng)的即時(shí)通訊工具,可以實(shí)現(xiàn)文本聊天,視頻通話文件傳輸?shù)裙δ?。本軟件的設(shè)計(jì)與實(shí)現(xiàn)也并不是完全為了畢業(yè)論文而做的無用軟件,其本身也有很大的實(shí)用性。首先本軟件抓住了市場(chǎng)上沒有l(wèi)inux實(shí)用的的局域網(wǎng)即時(shí)通訊工具,僅有的幾個(gè)網(wǎng)絡(luò)通訊工具還必須連接Internet網(wǎng)絡(luò),在沒有連接外網(wǎng)的情況下無法使用。基于此我想到了開發(fā)一套這樣的軟件,功

14、能是允許linux用戶享受到高速便捷的局域網(wǎng)通信工具給他們的學(xué)習(xí)和生活帶來的便利。軟件的跨平臺(tái)特性也使得同局域網(wǎng)內(nèi)的不同平臺(tái)的用戶可以進(jìn)行無障礙的信息文件的傳輸。解決了一直以來linux用戶和windows用戶在沒有外網(wǎng)的情況下相互傳輸信息和文件的窘境。整套軟件使用QT開發(fā)工具設(shè)計(jì)開發(fā),充分的利用了QT庫的跨平臺(tái)特性。同時(shí)在linux版本的軟件上已經(jīng)實(shí)現(xiàn)了視頻通話的功能。期間還涉及到了部分C語言的知識(shí),還有攝像頭驅(qū)動(dòng)V4l2的使用。用到

15、的主要通信協(xié)議是TCP/IP 中的 TCPServer UdpSocket,當(dāng)然其中有采用QT庫的也有采用C語言庫的相應(yīng)的API。在QT開發(fā)平臺(tái)為用戶提供了豐富的API和開發(fā)實(shí)例,方便了開發(fā)者的使用。 </p><p>  本論文將對(duì)軟件的各處重要的功能流程、實(shí)現(xiàn)原理、代碼實(shí)現(xiàn)和使用到的相關(guān)技術(shù)做詳細(xì)的論述和解釋。</p><p>  【關(guān)鍵詞】局域網(wǎng)即時(shí)通訊;V4l2;QT;TCP/IP

16、 ;UdpSocket;API;跨平臺(tái);linux</p><p>  Circle Communication</p><p>  ——Based QT LAN cross-platform instant messaging software, designAnd Implementation </p><p>  Li Youchao</p>

17、<p>  Pro. Zhang Liang</p><p>  【Abstract】The circle of communication is instant messaging tool for LAN, you can text chat, video calls and file transfer function. Design and implementation of this soft

18、ware is not completely sat for Thesis and useless software, its great practicality. First of all, this software captures the market linux practical LAN instant messaging tools, only a few network communication tools must

19、 be connected to the internet network, not connected to the extranet page can not be practical. Based on this,</p><p>  【Key words】LAN Instant Messaging;V4l 2;QT;TCP/IP ;UdpSocket;API;Cross-platform; </p&

20、gt;<p><b>  1 引言</b></p><p>  1.1 設(shè)計(jì)的目的及意義</p><p>  即時(shí)通信軟件是大家都比較熟悉的一種網(wǎng)絡(luò)通信工具,而且網(wǎng)絡(luò)上有很成熟的應(yīng)用,比如騰訊QQ、飛信、飛鴿、飛秋等等。這些為我們的工作生活和學(xué)習(xí)交流帶來了很大的方便。但是這些軟件大都是只在Windows平臺(tái)下才有,尤其是飛信、飛鴿、飛秋,只有Window

21、s的版本,并沒有Linux版本,而且QQ等其他工具在Windows和Linux互通時(shí)也極為的不方便,在最新版的Linux上QQ只能網(wǎng)頁登陸。所以對(duì)于Linux用戶來說市場(chǎng)上如果出現(xiàn)一款Linux系統(tǒng)下或者是跨平臺(tái)的軟件能夠提供即時(shí)聊天、文件傳輸、視頻通話等功能,這將大大的方便用戶的生活工作和學(xué)習(xí)。</p><p>  該程序的設(shè)計(jì)的目的就是為Linux用戶,還有跨平臺(tái)的群組用戶提供一個(gè)實(shí)用的交流工具,實(shí)現(xiàn)局域網(wǎng)內(nèi)

22、部各個(gè)平臺(tái)上用戶的信息交流,文件傳輸?shù)鹊?。同時(shí),由于本軟件是面向局域網(wǎng)用戶的,所以就省去了互聯(lián)網(wǎng)通信軟件復(fù)雜的登陸過程,簡(jiǎn)單的雙擊即可運(yùn)行使用,并且不要求用戶接入互聯(lián)網(wǎng)就能運(yùn)行使用,只要在一個(gè)局域網(wǎng)內(nèi)即可進(jìn)行通信,這也是局域網(wǎng)通信的一大優(yōu)點(diǎn)。本軟件主要有以下幾大應(yīng)用:</p><p>  1.跨平臺(tái)的通信聊天。局域網(wǎng)內(nèi)各個(gè)平臺(tái)上的用戶可使用本軟件件進(jìn)行方便的安全的聊天交流,并且還提供全網(wǎng)群組聊天功能,更加方便集體

23、交流,為用戶的學(xué)習(xí)、工作帶來方便,從而提高用戶的學(xué)習(xí)和作效率。</p><p>  2.跨平臺(tái)的文件傳輸。本軟件為用戶提供了高速的文件傳輸功能,并且同時(shí)也可實(shí)現(xiàn)跨平臺(tái)的高速文件傳輸,這是其他即時(shí)通信工具所不具有的。解決了平時(shí)不同平臺(tái)上的用戶最為頭疼的非得用U盤的存儲(chǔ)介質(zhì)來回的粘貼復(fù)制的窘境。極大的方便了用戶。這恐怕也是局域網(wǎng)即時(shí)通訊軟件最為常用的功能??缙脚_(tái)的局域網(wǎng)高速文件傳輸也正是本軟件的市場(chǎng)切入點(diǎn),具有一定的

24、市場(chǎng)前景。</p><p>  3.視頻通話。本軟件同時(shí)為Linux用戶提供了視頻通話的功能,從而為用戶提供了更加有聲有色的的交流方式,在局域網(wǎng)內(nèi)使用語音聊天或許大部分時(shí)候都有些不合時(shí)宜。但是進(jìn)行視頻交流的話,無疑提高了用戶之間的交流樂趣與效率,而且利用局域網(wǎng)網(wǎng)絡(luò)通信高速、安全的特點(diǎn),視頻通話的優(yōu)點(diǎn)體現(xiàn)的也就更加的淋漓盡致。</p><p>  本軟件的設(shè)計(jì)的意義:本軟件的設(shè)計(jì)的意義很明顯

25、,在就是為了方便用戶的工作和學(xué)習(xí),同時(shí)本軟件如果在Linux上發(fā)布,屆時(shí)肯定為開源軟件,也為廣大的互聯(lián)網(wǎng)用戶提供一個(gè)良好的教材,同時(shí)也可以集合眾多的互聯(lián)網(wǎng)用戶之力來完善本軟件。</p><p><b>  1.2 開發(fā)背景</b></p><p>  隨著網(wǎng)路的出現(xiàn),它在人們的生活中所扮演的角色越來越多,也越來越重要,人們可以通過這個(gè)空間進(jìn)行網(wǎng)絡(luò)聊天,實(shí)現(xiàn)彼此溝通,交

26、換信息,甚至網(wǎng)絡(luò)聊天工具在部分人的生活中由于傳統(tǒng)的電話通訊手段同等重要的趨勢(shì)。</p><p>  目前市場(chǎng)上的的即時(shí)通信工具雖然種類很多,且應(yīng)用也比較成熟,但是這并不意味著這些軟件對(duì)于市場(chǎng)的完全覆蓋。目前市場(chǎng)上依然有著通信軟件的盲區(qū),在這幾年的學(xué)習(xí)的應(yīng)用中,我發(fā)現(xiàn)Linux系統(tǒng)上就沒有一款比較好的局域網(wǎng)即時(shí)通信軟件。局域網(wǎng)的即時(shí)通信軟件是以企業(yè)內(nèi)部辦公,建立員工交流平臺(tái)為基礎(chǔ)通過系統(tǒng)整合,邊緣功能和實(shí)時(shí)協(xié)作的方

27、案。由于企業(yè)對(duì)信息類軟件的需求還在“探索”和“嘗試”階段,所以會(huì)導(dǎo)致很多系統(tǒng)不能互通,如Linux和Windows,這也成了局域網(wǎng)即時(shí)通信軟件的一個(gè)使命。當(dāng)信息軟件被廣泛使用之后,“互通”接口是否具備,將被作為軟件選用的重要條件。</p><p>  本軟件針對(duì)市場(chǎng)上的此類現(xiàn)象專門選用的QT跨平臺(tái)開發(fā)環(huán)境使用跨平臺(tái)的跨平臺(tái)標(biāo)準(zhǔn)庫,使得軟件可以在不同的平臺(tái)上編譯運(yùn)行,實(shí)現(xiàn)跨平臺(tái)通信的目的,尤其是在傳輸文件的時(shí)候這種

28、特性的優(yōu)勢(shì)將更加明顯。</p><p><b>  2 開發(fā)技術(shù)簡(jiǎn)介</b></p><p>  2.1 開發(fā)工具簡(jiǎn)介</p><p>  Qt是一個(gè)跨平臺(tái)的C++圖形用戶界面庫,由挪威TrollTech公司出品,目前包括Qt、基于FrameBuffer的Qtopia Core、快速開發(fā)工具Qt Designer和國際化工具Qt Linguis

29、t等部分。Qt支持所有的UNIX系統(tǒng),當(dāng)然也包括Linux系統(tǒng),還支持WinNT/Win2k、Windows 95/98平臺(tái)。</p><p>  基本上Qt同X-Window上的Motif、Openwin、GTK等圖形界面庫和Windows平臺(tái)上的MFC、OWL、VCL、ATL是同類型的。不過Qt還具有下列一些優(yōu)點(diǎn):</p><p> ?。?)優(yōu)良的跨平臺(tái)特性</p>&l

30、t;p>  Qt支持下列操作系統(tǒng):Microsoft Windows 95/98、Microsoft Windows NT、Linux、Solaris、SunOS、HP-UX、Digital UNIX (OSF/1、Tru64)、Irix、FreeBSD、BSD/OS、SCO、AIX、OS390和QNX等。</p><p><b> ?。?)面向?qū)ο?lt;/b></p>&l

31、t;p>  Qt的良好封裝機(jī)制使得Qt的模塊化程度非常高,可重用性較好,對(duì)于用戶開發(fā)來說是非常方便的。Qt提供了一種稱為signals/slots 的安全類型來替代callback,這使得各個(gè)元件之間的協(xié)同工作變得十分簡(jiǎn)單。</p><p><b>  (3)豐富的API</b></p><p>  Qt包括多達(dá)250個(gè)以上的C++類,還提供基于模板的colle

32、ctions、serialization、file、I/O device、directory management和date/time類。甚至還包括正則表達(dá)式的處理功能。</p><p>  (4)支持2D/3D圖形渲染,支持OpenGL</p><p>  (5)大量的開發(fā)文檔</p><p><b> ?。?)XML支持</b></p

33、><p>  但是真正使得Qt在自由軟件界的眾多Widgets(如Lesstif、Gtk、EZWGL、Xforms及fltk等)中脫穎而出的還是基于Qt的重量級(jí)軟件KDE。Qt雖然是商業(yè)公司的產(chǎn)品,但是走的卻是開源路線,提供免費(fèi)下載,全部都是開放源代碼,非商業(yè)用途亦采用GPL的版權(quán)宣告,著名的Open Source"KDE"項(xiàng)目便是采用Qt開發(fā)的。</p><p>  Tr

34、olltech也針對(duì)嵌入式環(huán)境推出了Qt/Embedded產(chǎn)品。與桌面版本不同,Qt/Embedded已經(jīng)直接取代了X Server及X Library等角色,將所有的功能全部整合在一起。</p><p>  Qt/Embedded同樣具有跨平臺(tái)的特點(diǎn),省掉了不少移植軟件的功夫,這樣的概念和Java十分接近。同時(shí)它還采用模塊化設(shè)計(jì),其最大的好處是有彈性,Qt/Embedded號(hào)稱最小,可以縮到800 KB左右,最

35、多可以長到3 MB(for Intel x86),這樣的彈性也讓Qt/Embedded更適合在嵌入式環(huán)境下生存。</p><p>  Qt/Embedded延續(xù)了Qt在X上的強(qiáng)大功能,在底層摒棄了X lib,僅采用FrameBuffer作為底層圖形接口。同時(shí),將外部輸入設(shè)備抽象為keyboard和mouse輸入事件,底層接口支持鍵盤、GPM鼠標(biāo)、觸摸屏及用戶自定義的設(shè)備等。</p><p>

36、;  Qt/Embedded類庫完全采用C++封裝。豐富的控件資源和較好的可移植性是Qt/Embedded最為優(yōu)秀的一方面。它的類庫接口完全兼容于同版本的Qt-X11,使用X下的開發(fā)工具可以直接開發(fā)基于Qt/Embedded的應(yīng)用程序QUI界面。</p><p>  與前兩種GUI不同的是,Qt/Embedded的底層圖形引擎只能采用FrameBuffer,這就注定了它是針對(duì)高端嵌入式圖形領(lǐng)域的應(yīng)用而設(shè)計(jì)的。由于

37、該庫的代碼追求面面俱到,以增加它對(duì)多種硬件設(shè)備的支持,造成了其底層代碼比較凌亂,各種補(bǔ)丁較多的問題。Qt/Embedded的結(jié)構(gòu)也過于復(fù)雜和臃腫,很難進(jìn)行底層的擴(kuò)充、定制和移植,尤其是用來實(shí)現(xiàn)signal/slot機(jī)制的moc文件。</p><p>  Qt/Embedded當(dāng)前已經(jīng)升級(jí)為Qtopia Core和Qtopia Core,繼承了Qt4的新技術(shù),包括:高性能渲染引擎、模板容器類及基于行為的主窗口架構(gòu),

38、改進(jìn)的功能特點(diǎn)包括文本渲染與多線程技術(shù)。當(dāng)編譯Qtopia Core時(shí),可以去除不用的功能,以最小化軟件的占用空間。</p><p>  2.2 開發(fā)技術(shù)簡(jiǎn)介</p><p>  本軟件的開發(fā)所使用的技術(shù)總的來說可以分為以下幾大類:</p><p>  用來進(jìn)行通信的部分,Tcp socket通信 和 Qudpsocket</p><p> 

39、 TCP即Transmission Control Protocol,傳輸控制協(xié)議。與UDP不同,它是面向連接和數(shù)據(jù)流的可靠傳輸協(xié)議。也就是說,它能使一臺(tái)計(jì)算機(jī)上的數(shù)據(jù)無差錯(cuò)的發(fā)往網(wǎng)絡(luò)上的其他計(jì)算機(jī),所以當(dāng)要傳輸大量數(shù)據(jù)時(shí),我們選用TCP協(xié)議。</p><p>  TCP協(xié)議的程序使用的是客戶端/服務(wù)器模式,在QT中,使用QTcpServer類建立服務(wù)器。我們?cè)诜?wù)器端進(jìn)行端口的監(jiān)聽,一旦發(fā)現(xiàn)客戶端的連接請(qǐng)求,就

40、會(huì)發(fā)出newConnection()信號(hào),我們可以關(guān)聯(lián)這個(gè)信號(hào)到我們自己的槽函數(shù),進(jìn)行相互之間套接字的建立。一旦有數(shù)據(jù)到來相應(yīng)端的套接字就會(huì)發(fā)出readyRead()信號(hào),我們可以關(guān)聯(lián)此信號(hào),進(jìn)行數(shù)據(jù)的接收。</p><p><b>  其通信模型如圖:</b></p><p>  Qudpsocket 則是一種面向無連接的的不可靠的數(shù)據(jù)傳輸技術(shù),他可以不用tcp所需

41、的連接,所以這種協(xié)議是盡最大努力的交付數(shù)據(jù),這種協(xié)議在網(wǎng)絡(luò)環(huán)境較好的局域網(wǎng)內(nèi)應(yīng)用相當(dāng)有價(jià)值。其通信模型如圖:</p><p> ?。?)信號(hào)和槽是Qt編程的一個(gè)重要部分。</p><p>  這個(gè)機(jī)制可以在對(duì)象之間彼此并不了解的情況下將它們的行為聯(lián)系起來。在前幾個(gè)例程中,我們已經(jīng)連接了信號(hào)和槽,聲明了控件自己的信號(hào)和槽,并實(shí)現(xiàn)了槽函數(shù),發(fā)送了信號(hào)。</p><p>

42、  槽和普通的c++成員函數(shù)很像。它們可以是虛函數(shù)(virtual),也可被重載(overload),可以是公有的(public),保護(hù)的(protective),也可是私有的(private),它們可以象任何c++成員函數(shù)一樣被調(diào)用,可以傳遞任何類型的參數(shù)。不同在于一個(gè)槽函數(shù)能和一個(gè)信號(hào)相連接,只要信號(hào)發(fā)出了,這個(gè)槽函數(shù)就會(huì)自動(dòng)被調(diào)用。</p><p>  connect函數(shù)語法如下:</p>&

43、lt;p>  connect(sender, SIGNAL(signal), receiver, SLOT(slot));</p><p>  sender和receiver是QObject對(duì)象指針,signal和slot是不帶參數(shù)的函數(shù)原型。SIGNALE()和SLOT()宏的作用是把他們轉(zhuǎn)換成字符串。</p><p>  在目前有的例子中,我們已經(jīng)連接了不同的信號(hào)和槽。實(shí)際使用中

44、還要考慮入戲一些規(guī)則:</p><p> ?。ㄒ唬┮粋€(gè)信號(hào)可以連接到多個(gè)槽:</p><p>  connect(slider,SIGNAL(valueChanged(int)),spinBox, SLOT(setValue(int)));</p><p>  connect(slider,SIGNAL(valueChanged(int)),this, SLOT(u

45、pdateStatusBarIndicator(int)));</p><p>  當(dāng)信號(hào)發(fā)出后,槽函數(shù)都會(huì)被調(diào)用,但是調(diào)用的順序是隨機(jī)的,不確定的。</p><p> ?。ǘ┒鄠€(gè)信號(hào)可以連接到一個(gè)槽</p><p>  connect(lcd,SIGNAL(overflow()),this,SLOT(handleMathError()));</p>

46、<p>  connect(calculator,SIGNAL(divisionByZero()),this,SLOT(handleMathError()));</p><p>  任何一個(gè)信號(hào)發(fā)出,槽函數(shù)都會(huì)執(zhí)行。</p><p> ?。ㄈ┮粋€(gè)信號(hào)可以和另一個(gè)信號(hào)相連</p><p>  connect(lineEdit, SIGNAL(textCh

47、anged(const QString &)),this, SIGNAL(updateRecord(const QString &)));</p><p>  第一個(gè)信號(hào)發(fā)出后,第二個(gè)信號(hào)也同時(shí)發(fā)送。除此之外,信號(hào)與信號(hào)連接上和信號(hào)和槽連接相同。</p><p> ?。ㄋ模┻B接可以被刪除</p><p>  disconnect(lcd,SIGNAL

48、(overflow()),this,SLOT(handleMathError()));</p><p>  這個(gè)函數(shù)很少使用,一個(gè)對(duì)象刪除后,Qt自動(dòng)刪除這個(gè)對(duì)象的所有連接。</p><p>  信號(hào)和槽函數(shù)必須有著相同的參數(shù)類型,這樣信號(hào)和槽函數(shù)才能成功連接:</p><p>  connect(ftp,SIGNAL(rawCommandReply(int,con

49、stQString&)),this, SLOT(processReply(int, const QString &)));</p><p>  如果信號(hào)里的參數(shù)個(gè)數(shù)多于槽函數(shù)的參數(shù),多余的參數(shù)被忽略:</p><p>  connect(ftp,SIGNAL(rawCommandReply(int, const QString&)),this,SLOT(checkE

50、rrorCode(int)));</p><p>  如果參速類型不匹配,或者信號(hào)和槽不存在,在debug狀態(tài)時(shí),Qt會(huì)在運(yùn)行期間給出警告。如果信號(hào)和槽連接時(shí)包含了參數(shù)的名字,Qt將會(huì)給出警告。</p><p>  以前我們列舉的例子中都是控件的信號(hào)和槽。但是信號(hào)和槽機(jī)制在 QObject中就實(shí)現(xiàn)了,可以實(shí)現(xiàn)在任何從QObject繼承的子類中。</p><p>  

51、(3)用于采集攝像頭數(shù)據(jù)的V4l2驅(qū)動(dòng)API以及圖像壓縮技術(shù)</p><p>  V4L(Video for Linux )是Linux 內(nèi)核中關(guān)于視頻設(shè)備的子系統(tǒng),它為linux 下的視頻驅(qū)動(dòng)提供了統(tǒng)一的接口,使得應(yīng)用程序可以使用統(tǒng)一的API 函數(shù)操作不同的視頻設(shè)備,極大地簡(jiǎn)化了視頻系統(tǒng)的開發(fā)和維護(hù)。</p><p>  由于 V4L 有很多缺陷,Bill Dirks 等人對(duì)其進(jìn)行了重新

52、設(shè)計(jì),并取名為Video for LinuxTwo(V4L2),最早出現(xiàn)于Linux2.5.x 版本。V4L2 相比于V4L 有更好的擴(kuò)展性和靈活性,并且支持的硬件設(shè)備更多。但是需要注意的是,V4L2 對(duì)V4L 進(jìn)行了徹底的改造,因而兩者并不兼容。</p><p>  Linux 系統(tǒng)中,所有的外部設(shè)備都被看成一種特殊的文件,稱之為設(shè)備文件。應(yīng)用程序可以通過訪問這些特殊文件實(shí)現(xiàn)對(duì)應(yīng)設(shè)備的控制。V4L2 視頻設(shè)備的

53、設(shè)備文件為/dev 目錄下的videoN(N 為0~63)文件,其主設(shè)備號(hào)為81,次設(shè)備號(hào)為N(N 為0~63)。</p><p>  在v4l2中有主要的技術(shù)參數(shù)如下:</p><p>  VIDIOC_REQBUFS:分配內(nèi)存</p><p>  VIDIOC_QUERYBUF:把VIDIOC_REQBUFS中分配的數(shù)據(jù)緩存</p><p&g

54、t;<b>  換成物理地址</b></p><p>  VIDIOC_QUERYCAP:查詢驅(qū)動(dòng)功能</p><p>  VIDIOC_ENUM_FMT:獲取當(dāng)前驅(qū)動(dòng)支持的視頻格式</p><p>  VIDIOC_S_FMT:設(shè)置當(dāng)前驅(qū)動(dòng)的頻捕獲格式</p><p>  VIDIOC_G_FMT:讀取當(dāng)前驅(qū)動(dòng)的頻捕獲

55、格式</p><p>  VIDIOC_TRY_FMT:驗(yàn)證當(dāng)前驅(qū)動(dòng)的顯示格式</p><p>  VIDIOC_CROPCAP:查詢驅(qū)動(dòng)的修剪能力</p><p>  VIDIOC_S_CROP:設(shè)置視頻信號(hào)的邊框</p><p>  VIDIOC_G_CROP:讀取視頻信號(hào)的邊框</p><p>  VIDIOC_

56、QBUF:把數(shù)據(jù)從緩存中讀取出來</p><p>  VIDIOC_DQBUF:把數(shù)據(jù)放回緩存隊(duì)列</p><p>  VIDIOC_STREAMON:開始視頻顯示函數(shù)</p><p>  VIDIOC_STREAMOFF:結(jié)束視頻顯示函數(shù)</p><p>  VIDIOC_QUERYSTD:檢查當(dāng)前視頻設(shè)備支持的標(biāo)準(zhǔn),例如PAL</p

57、><p>  或NTSC(有些是必須的有些是可選擇的)。</p><p><b>  結(jié)構(gòu)體:</b></p><p>  struct v4l2_requestbuffers reqbufs;//向驅(qū)動(dòng)申請(qǐng)幀緩沖的請(qǐng)求,里</p><p><b>  包含申請(qǐng)的個(gè)數(shù)</b></p>&l

58、t;p>  struct v4l2_capability cap;//這個(gè)設(shè)備的功能,比如是否是視頻輸入</p><p><b>  備</b></p><p>  struct v4l2_input input; //視頻輸入</p><p>  struct v4l2_standard std;//視頻的制式,比如PAL,NTSC&l

59、t;/p><p>  struct v4l2_format fmt;//幀的格式,比如寬度,高度等</p><p>  struct v4l2_buffer buf;//代表驅(qū)動(dòng)中的一幀</p><p>  v4l2_std_id stdid;//視頻制式,例如:V4L2_STD_PAL_B</p><p>  struct v4l2_query

60、ctrl query;//查詢的控制</p><p>  struct v4l2_control control;//具體控制的值</p><p>  用于控制與多人視頻的thread 和Qthread多線程技術(shù)</p><p>  多線程技術(shù)對(duì)于我們來說不應(yīng)該陌生,這種技術(shù)不僅節(jié)約存儲(chǔ)空間,提高程序的運(yùn)行效率。并且可以實(shí)現(xiàn)很多實(shí)用的功能。</p>&

61、lt;p> ?。?)用于控制界面顯示的QtGui庫內(nèi)容</p><p>  QtGui是一個(gè)非常強(qiáng)大的編程庫同時(shí)它也是QT中所有類的父類,它為用戶提供了豐富的API和各種實(shí)例,這些在前面開發(fā)工具基本已經(jīng)介紹,此處不再贅述。</p><p><b>  3 需求分析</b></p><p>  3.1 功能需求分析</p>&

62、lt;p>  3.1.1 群聊功能</p><p>  局域網(wǎng)內(nèi)所有用戶都可在聊天室內(nèi)發(fā)送消息,并且接收其他用戶發(fā)往聊天室的消息,理論上用戶可以看到程序運(yùn)行后所有發(fā)往聊天室的消息。</p><p>  3.1.2 私聊功能</p><p>  一個(gè)完整的聊天軟件定然是缺少不了私聊功能的,軟件還提供私聊功能用戶雙擊用戶列表上響應(yīng)的用戶后即可打開與之對(duì)應(yīng)的聊天窗口

63、并且可以與之進(jìn)行任意的聊天。當(dāng)然用戶可以同時(shí)與多人進(jìn)行私聊而不會(huì)發(fā)生干擾。</p><p>  3.1.3 聊天字體設(shè)置</p><p>  為了使用戶的文字更加的生動(dòng)和個(gè)性化,用戶可以通過面板上的各種控件來修改文字、大小和顏色。發(fā)送到對(duì)方的聊天窗口時(shí)這些文字依然要按照發(fā)送者的設(shè)置顯示。</p><p>  3.1.4 聊天記錄功能</p><p

64、>  軟件會(huì)自動(dòng)的記錄用戶的所有聊天內(nèi)容并保存在本地的文件中,包括群聊和私聊內(nèi)容。當(dāng)用戶點(diǎn)擊聊天記錄按鈕時(shí)還可以將對(duì)應(yīng)的聊天記錄顯示在擴(kuò)展出來的聊天記錄顯示框內(nèi)。而且比較重要的一點(diǎn)是,在保存聊天記錄是時(shí)候會(huì)將文字的格式一并保存,并且可以按照原來的格式顯示。用戶還可以主動(dòng)的將信息顯示窗口內(nèi)的內(nèi)容自行的保存到自己想要保存的文件中去。</p><p>  3.1.5 文件傳送功能</p><p

65、>  當(dāng)用戶需要傳送文件時(shí)只需要點(diǎn)擊與之對(duì)應(yīng)的聊天框,或者選擇群聊天室用戶列表對(duì)應(yīng)的用戶后,點(diǎn)擊文件傳送按鈕即可選擇文件然后進(jìn)行高效的文件傳輸了,高效簡(jiǎn)便。</p><p>  3.1.6 維護(hù)在線用戶列表</p><p>  在線用戶列表只顯示局域網(wǎng)內(nèi)已經(jīng)運(yùn)行軟件的用戶的信息。其他的則不做顯示,當(dāng)有用戶加入時(shí),用戶列表就自動(dòng)的在底一行加入新來的用戶信息,其他用戶的信息一次后移。當(dāng)有

66、用戶退出時(shí)列表將其信息刪除,然后后邊的用戶一次向前移動(dòng)一行。</p><p>  3.1.7 修改昵稱</p><p>  軟件允許用戶修改自己的顯示名稱。程序運(yùn)行最初時(shí),列表上顯示的是用戶的系統(tǒng)用戶名。用戶可點(diǎn)擊,自己的名稱進(jìn)行編輯修改。修改完后向全網(wǎng)實(shí)時(shí)更新。名稱的修改可以保存下次運(yùn)行時(shí)就顯示本次修改后的名稱。</p><p>  以上功能都是可以跨平臺(tái)實(shí)現(xiàn)的也

67、就是說同樣的代碼可以在多種操作系統(tǒng)上編譯生成可執(zhí)行程序,然后發(fā)布運(yùn)行。也就是說同一款軟件可以跨平臺(tái)進(jìn)行信息交流和文件傳輸。</p><p>  3.1.8 視頻通話</p><p>  由于時(shí)間與目前所獲得的知識(shí)的關(guān)系,系統(tǒng)目前只能為linux用戶提供了視頻通話的功能。在linux下用戶可以與私聊的對(duì)方進(jìn)行生動(dòng)有趣的視頻通話功能。</p><p>  3.2 數(shù)據(jù)需

68、求分析</p><p><b>  3.2.1文字信息</b></p><p>  用戶的個(gè)人信息和聊天內(nèi)容信息由于都是文字信息,其特點(diǎn)是占用的存儲(chǔ)空間小,類型一致,比較方便使用,所以這些信息都用QT中的字符串類QString表示。傳輸這些數(shù)據(jù)的時(shí)候用的則是數(shù)據(jù)流的形式傳送的。</p><p><b>  3.2.2文件信息</

69、b></p><p>  進(jìn)行文件傳送的時(shí)候,很明顯數(shù)據(jù)是塊數(shù)據(jù)而且數(shù)據(jù)量非常的大,這里將用文件分成一個(gè)個(gè)的塊block送入流QDataStream中進(jìn)行傳送。</p><p><b>  3.2.3視頻信息</b></p><p>  視頻信息可以分成單幅的圖片傳送,這里我又用到了另一種語言,并且用到了緩沖區(qū)的概念。</p>

70、<p>  3.3 技術(shù)需求分析</p><p>  網(wǎng)絡(luò)通信技術(shù)TCP/IP 、socket技術(shù)在網(wǎng)絡(luò)通信中定然是不可缺少了。這里所使用的將是QT中的socket和tcp技術(shù),還有部分功能將使用c語言中的socket技術(shù)。</p><p>  界面設(shè)計(jì)技術(shù),這里的界面設(shè)計(jì)絕大部分將用QT Designer設(shè)計(jì)完成。少部分界面由于需要自行定義,故用代碼實(shí)現(xiàn)。</p>

71、;<p>  視頻采集技術(shù),在linux下將使用v4l2作為主要的視頻采集技術(shù)。</p><p>  3.4 性能需求分析</p><p>  既然是即時(shí)通訊工具,所以高速的信息傳輸和響應(yīng)是必不可少的,由于所處的環(huán)境是局域網(wǎng),所以足以滿足要求。</p><p>  對(duì)于視頻和文件的傳輸則要求視頻能夠達(dá)到流暢的顯示,文件的傳輸速度單位應(yīng)該是MB/s。&l

72、t;/p><p>  3.4 編寫環(huán)境需求分析</p><p>  程序的全部過程將全部在linux下編寫完成,并且到達(dá)可運(yùn)行的地步。中間可能會(huì)在windows系統(tǒng)上做少許的實(shí)驗(yàn)和修改。</p><p>  4 軟件設(shè)計(jì)與代碼分析</p><p>  4.1 軟件結(jié)構(gòu)設(shè)計(jì)</p><p>  局域網(wǎng)聊天軟件和網(wǎng)絡(luò)版的聊天軟

73、件雖然同為即時(shí)工具,但是仍然有許多的不公之處,通常的網(wǎng)絡(luò)即時(shí)通訊工具如騰訊qq需要有一個(gè)登錄的過程,用戶的客戶端只要在連接網(wǎng)絡(luò)的情況下,才能登錄服務(wù)器,所以qq是一種c/s結(jié)構(gòu)的軟件。而我要設(shè)計(jì)實(shí)現(xiàn)的局域網(wǎng)即時(shí)通訊工具明顯不需要服務(wù)器端和登錄過程。打開軟件即可顯示在線用戶列表,在局域網(wǎng)內(nèi)也不需要專門的服務(wù)器。所以這種結(jié)構(gòu)是一種客戶端直接到客戶端的通信,即P to P結(jié)構(gòu)的軟件。這樣方便了用戶的操作,增加了程序的易用性。程序的主要功能模塊

74、兒設(shè)計(jì)如下:</p><p>  4.1.1 在線用戶列表顯示以及維護(hù)模塊。 </p><p>  4.1.2私聊信息輸入發(fā)送與顯示模塊。</p><p>  4.1.3 聊天室信息輸入發(fā)送以及顯示模塊。</p><p>  4.1.4 信息接收分發(fā)處理模塊。</p><p>  4.1.5 文件傳輸模塊。</p

75、><p>  4.1.6 聊天記錄模塊。</p><p>  4.1.7 視頻采集傳輸模塊。</p><p>  4.1.8 視頻顯示模塊。</p><p>  軟件結(jié)構(gòu)圖如圖4.1:</p><p><b>  圖4.1軟件結(jié)構(gòu)圖</b></p><p>  4.2 各模塊功

76、能流程圖及聯(lián)系</p><p>  整個(gè)軟件的各個(gè)主要的模塊已經(jīng)在上節(jié)簡(jiǎn)單的進(jìn)行了羅列,但是他們之間并不是簡(jiǎn)簡(jiǎn)單單的的并列或者包含的關(guān)系。下面就各模塊的具體實(shí)現(xiàn)和模塊之間的詳細(xì)調(diào)用關(guān)系設(shè)計(jì)進(jìn)行詳細(xì)的介紹。</p><p>  4.2.1用戶列表窗口上的模塊及詳細(xì)功能</p><p>  用戶列表的最直觀的功能是顯示在線用戶的列表,維護(hù)用戶列表,但是在后臺(tái)用戶列表還有

77、程序中極為重要的功能:(1)接收來自其他用戶的消息(2)將用戶的消息分類并發(fā)往對(duì)應(yīng)的聊天窗口內(nèi)(3)提供文件發(fā)送的服務(wù)端和客戶端,當(dāng)本地用戶發(fā)送文件時(shí),用戶列表在后臺(tái)提供文件發(fā)送服務(wù);當(dāng)接收文件時(shí)用戶列表又啟動(dòng)文間接收的實(shí)例,作為文件傳送的服務(wù)端。(4)視頻的聊天的服務(wù)端。當(dāng)與別人視頻通話時(shí),用戶列表就會(huì)啟動(dòng)視頻采集服務(wù)端的程序并等待其他用戶的連接。(5)用戶列表還提供了修改昵稱的小功能,方便用戶的個(gè)性化交流。</p>&

78、lt;p>  用戶列表的工作流程圖如圖4.2:</p><p>  圖4.2 用戶列表工作流程圖</p><p>  4.2.2私聊窗口上的模塊及詳細(xì)功能</p><p>  私聊窗口的上的主要功能是:(1)輸入并發(fā)送信息。(2)改變輸入信息字體格式。(3)顯示私聊信息。(4)顯示歷史聊天記錄(5)發(fā)送文件傳輸請(qǐng)求。(6)發(fā)送視頻通話請(qǐng)求。(7)作為視頻客戶端

79、顯示對(duì)方傳來的視頻信息。(8)自動(dòng)和手動(dòng)保存聊天記錄。(自動(dòng)保存聊天記錄的時(shí)候會(huì)將聊天記錄字體的格式等信息一同記錄,并且能夠再客戶端完全還原)</p><p>  私聊窗口的工作流程圖如圖4.3 (17頁):</p><p>  4.2.3聊天室窗口上的模塊及詳細(xì)功能</p><p>  聊天室窗口主要負(fù)責(zé)群聊信息的發(fā)送和顯示,同時(shí)群聊窗口提供了顯示用戶列表和群聊消

80、息歷史記錄的功能。</p><p>  功能羅列如下:(1)輸入并發(fā)送信息。(此處的發(fā)送與私聊發(fā)送略有不同,此處的socke是以廣播的形式發(fā)送到全網(wǎng)的)(2)改變輸入信息字體格式。(3)顯示群聊信息。(4)顯示歷史聊天記錄(5)通過選擇用戶發(fā)送文件傳輸請(qǐng)求。(6)自動(dòng)和手動(dòng)保存聊天記錄。(自動(dòng)保存聊天記錄的時(shí)候會(huì)將聊天記錄字體的格式等信息一同記錄,并且能夠再客戶端完全還原)</p><p>

81、;  聊天室窗口的工作流程圖如圖4.4(18頁):</p><p>  圖4.3 私聊窗口流程圖</p><p>  圖4.4聊天室窗口流程圖</p><p>  4.2.4文件傳送服務(wù)端的功能及流程</p><p>  文件傳送服務(wù)端由用戶列表唯一實(shí)例化,可以作為參數(shù)傳遞給私聊窗口和聊天室窗口。當(dāng)用戶列表接收到打開文件服務(wù)器的信號(hào)后,就根據(jù)

82、信號(hào)的參數(shù)激發(fā)對(duì)應(yīng)的槽函數(shù)初始化文件服務(wù)器,并打開文件選擇對(duì)話框進(jìn)行要傳送的文件選擇,文件選擇完成后用戶方可選擇發(fā)送,發(fā)送一個(gè)文件信息,并等待對(duì)方連接到服務(wù)器文件發(fā)送所使用的通信協(xié)議是有連接的TCP協(xié)議,不同于發(fā)送消息的udp協(xié)議。發(fā)送完成后關(guān)閉對(duì)話框并顯示系統(tǒng)提示信息。</p><p>  文件服務(wù)器工作流程圖如圖4.5</p><p>  圖4.4 文件服務(wù)器窗口流程圖</p&g

83、t;<p>  4.2.5文件傳送客戶端的功能及流程</p><p>  文件傳送的客戶端相對(duì)來說功能就相對(duì)的簡(jiǎn)單了,文件接收端和客戶端一樣也是由用戶列表實(shí)例化一個(gè)對(duì)象,當(dāng)然為了避免端口重用的麻煩,本程序只提供了一個(gè)客戶端實(shí)例,也就是說同一時(shí)刻只能允許一個(gè)文件的接收與發(fā)送。當(dāng)用戶同意接收文件后,用戶列表就啟動(dòng)客戶端連接對(duì)方的文件服務(wù)器,自動(dòng)的開始文件的傳送。文件傳送的過程中用戶可以選擇最小化界面。傳

84、送完成后窗口關(guān)閉,系統(tǒng)發(fā)出提示信息。</p><p>  文件客戶端工作流程圖如圖4.5</p><p>  圖4.5 文件客戶端窗口流程圖</p><p>  4.2.5視頻通話服務(wù)端的功能及流程</p><p>  視頻通話功能是程序中比較特別的一個(gè)模塊。由于采集攝像頭的視頻需要與底層的驅(qū)動(dòng)程序打交道,而在不同的平臺(tái)上驅(qū)動(dòng)程序是不同的。也

85、就是說在不同的平臺(tái)上編寫的視頻采集程序是不能夠通用的。所以視頻模塊的功能不能與其他部分代碼聯(lián)系的太過緊密。這樣可以避免在不同平臺(tái)上修改同樣代碼的麻煩,而就目前來說,我只掌握了在linux上的視頻驅(qū)動(dòng)程序的V4L2(Video For Linux Two)API而且是用C語言進(jìn)行交涉,好在c++的函數(shù)庫對(duì)于c語言完全兼容。所以對(duì)于這部分功能的整合就出現(xiàn)了兩個(gè)方案:</p><p>  方案一、利用C與c++混編的方

86、法,在C++的函數(shù)總直接導(dǎo)入相關(guān)頭文件并調(diào)用相應(yīng)的函數(shù)。但是這樣顯得代碼依然具有相當(dāng)?shù)囊蕾囆?,換到windows平臺(tái)上依然需要修改很大一部分內(nèi)部代碼。對(duì)維護(hù)程序不是很方便。</p><p>  方案二、首先將視頻模塊用c語言編寫完成,并生成可執(zhí)行程序。在住程序中直接調(diào)用執(zhí)行程序執(zhí)行。這種方案的好處是實(shí)現(xiàn)的視頻模塊與整個(gè)程序完全的分離。更換平臺(tái)是只需更換響應(yīng)的視頻模塊的可執(zhí)行程序即可幾乎不用修改主程序的代碼。其他功

87、能也能實(shí)現(xiàn)輕易的跨平臺(tái)。</p><p>  經(jīng)過利弊權(quán)衡我選擇了方案二。</p><p>  視頻服務(wù)端模塊的具體流程如圖:</p><p>  圖4.6視頻服務(wù)端模塊的具體流程圖</p><p>  視頻采集緩沖流程圖:</p><p>  圖4.7 視頻采集緩沖流程圖</p><p>  

88、視頻緩沖區(qū)使用示意圖:</p><p>  圖4.8 視頻緩沖區(qū)使用示意圖</p><p>  4.3 各模塊功能具體設(shè)計(jì)與代碼實(shí)現(xiàn)</p><p>  4.3.1用戶列表模塊功能具體實(shí)現(xiàn)</p><p>  (1)用戶列表的維護(hù),與本地信息的廣播。</p><p>  用戶列表的維護(hù)本軟件采用了QT中的一個(gè)QTabl

89、eWidget的組件,這個(gè)組件的優(yōu)點(diǎn)就是非常方便維護(hù)。本軟件把每一條用戶個(gè)人信息當(dāng)做表中的一行,行中的第0、1、2列分別用來保存用戶的登陸名、主機(jī)名、和IP地址,這三個(gè)信息都是系統(tǒng)識(shí)別用戶所使用的,所以這三列都對(duì)于用戶都是不可見(tableWidget->setColumnHidden(0,true);)。用戶真正看到是表格的第四列的內(nèi)容。這一列為了用戶信息的友好顯示在表格中利用QPixmap為表格加入了一個(gè)圖片其顯示效果就如QQ

90、上的頭像(show->setIcon(QIcon(QPixmap("image/User.png")));),圖標(biāo)后邊跟的是用戶的昵稱和IP。當(dāng)有新來的用戶時(shí)我們就在表格的第0行進(jìn)行插入。表中原來的列就會(huì)自動(dòng)的后移,這就是表的好處之一,不用自己些循環(huán)語句來進(jìn)行維護(hù),QTableWidget自己會(huì)進(jìn)行維護(hù)。當(dāng)由用戶離開時(shí)也是如此,QTableWidget甚至還提供了一個(gè)查找函數(shù)find,用戶可利用這個(gè)函數(shù)輕易找到

91、目標(biāo)行而不必自己寫循環(huán)語句進(jìn)行查詢。然后直接接將此列刪除即可。后面的行會(huì)自動(dòng)補(bǔ)齊。每當(dāng)本地接收到一個(gè)新用</p><p>  Void newParticipant(QString userName,QString localHostName, QString ipAddress);</p><p>  void participantLeft(QString userName,QStri

92、ng localHostName , QString time);</p><p>  本地信息的廣播利用Socket廣播了一個(gè)newParticipant類型的消息,消息內(nèi)部含有用戶的登陸名、IP和主機(jī)名等信息。這里說到了消息的類型,有必要提前說明一下,為了方便系統(tǒng)頂定義了一個(gè)枚舉數(shù)據(jù)類型MessageType用來區(qū)分接收或者發(fā)出的消息是什么類型方便接收到的用戶采用正確的處理方法,其定義如下:</p>

93、;<p>  enum MessageType{Message,NewParticipant,ParticipantLeft,FileName,Refuse,XMessage,VideoChat,VideoAgree,VideoRefuse,VideoClose};</p><p> ?。?) 信息的接收與處理。</p><p>  為了便于管理和程序數(shù)據(jù)的集中性,本軟件的數(shù)

94、據(jù)接收與處理工作全部由用戶列表窗口類來完成。為此在類中聲明了一個(gè)Qudpsocket并綁定端口45454,這也是整個(gè)聊天系統(tǒng)的默認(rèn)通信端口。實(shí)現(xiàn)如下:</p><p>  udpSocket = new QUdpSocket(this);//聊天的socket和端口</p><p>  port = 45454;</p><p>  udpSocket->bi

95、nd(port,QUdpSocket::ShareAddress </p><p>  QUdpSocket::ReuseAddressHint);</p><p>  同時(shí)為udpsocket連接了槽函數(shù):</p><p>  connect(udpSocket,SIGNAL(ready

96、Read()),this,SLOT(processPending Datagrams()));</p><p>  processPendingDatagrams()的聲明接口如下:</p><p>  void processPendingDatagrams();</p><p>  udpSocket會(huì)一直等待數(shù)據(jù)到來,每當(dāng)udpSocket接收到數(shù)據(jù)后就

97、會(huì)發(fā)送readyRead()信號(hào),然后信號(hào)和槽的機(jī)制來調(diào)用數(shù)據(jù)處理函數(shù)void processPendingDatagrams();</p><p>  數(shù)據(jù)處理函數(shù)的主要內(nèi)容是通過信息的switch語句匹配不同的數(shù)據(jù)類型然后調(diào)用響應(yīng)的處理函數(shù)即可。此處我要舉例私聊消息的處理過程:</p><p>  當(dāng)switch語句判斷出消息的類型是XMessage(私聊消息)時(shí),首先根據(jù)約定的格式讀

98、出消息的內(nèi)容:</p><p>  in >>userName >>localHostName >>ipAddress >>message;</p><p>  然后調(diào)用私聊消息分配函數(shù):</p><p>  assignXMessage(userName,ipAddress,message);//分配私聊消息<

99、/p><p>  此處還要說明的是在用戶列表串口類中軟件一開始就聲明了一個(gè)私聊窗口指針數(shù)組chat *testprivate[50];作為類的成員變量來標(biāo)明已經(jīng)打開的私聊窗口,方便用戶列表類中的集中管理。assignXMessage的作用就是查詢這個(gè)表看看消息的聊天窗口是否已經(jīng)被打開。如果已經(jīng)打開就調(diào)用chat 類中的getXmessage()函數(shù)來顯示消息。如果沒有打開系統(tǒng)就會(huì)在屏幕的右下角彈出一個(gè)提示窗口來提醒

100、用戶新消息,此窗口默認(rèn)5秒關(guān)閉,但當(dāng)鼠標(biāo)移動(dòng)到窗口上后自動(dòng)關(guān)閉取消,離開后自動(dòng)關(guān)閉再次計(jì)時(shí)開始。淡然用戶可以點(diǎn)擊按鈕實(shí)現(xiàn)關(guān)閉,或者打開私聊窗口。</p><p>  assignXMessage具體定義如下:</p><p>  void UserList::assignXMessage(QString userName,QString ipAddress,QString message)

101、</p><p><b>  {</b></p><p><b>  ………</b></p><p><b>  }</b></p><p>  (4)用于信息的提取與昵稱修改。</p><p>  用戶信息的獲取分為獲取登錄名和獲取IP兩個(gè)函數(shù):<

102、;/p><p>  QString getUserName();</p><p>  QString getIP();</p><p>  獲取用戶名時(shí)函數(shù)會(huì)先訪問一個(gè)用于保存昵稱的文件,如果系統(tǒng)初次運(yùn)行,該文件不存在,那么就會(huì)繼續(xù)提取體用的用戶名作為登陸名顯示在用戶的列表上,用戶可以單擊用戶列表頂部自己的用戶名行修改,結(jié)果保存在本地的文件中。并且實(shí)時(shí)更新列表上的顯示名

103、稱。下次運(yùn)行時(shí)的顯示名稱也會(huì)是修改過的名稱。</p><p>  這個(gè)功能的實(shí)現(xiàn)是通過連接一個(gè)按鈕和行編輯框的信號(hào)和槽來完成的:</p><p>  ui->lineEdit->hide();//輸入框默認(rèn)隱藏</p><p>  ui->pushButton->setText(tr(" %1").arg(getUserN

104、ame()));</p><p>  connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(buttonClicked()));</p><p>  connect(ui->lineEdit,SIGNAL(returnPressed()),this,SLOT(lineEditReturnPressed()));</p>

105、<p>  void UserList::buttonClicked()//點(diǎn)擊昵稱激發(fā)的槽函數(shù)主要用于顯示輸入框后隱藏按鈕</p><p><b>  {</b></p><p>  ui->lineEdit->setText(ui->pushButton->text());</p><p>  ui-&

106、gt;lineEdit->show();</p><p>  ui->pushButton->hide();</p><p><b>  }</b></p><p>  void UserList::lineEditReturnPressed()//當(dāng)輸入框監(jiān)聽到回車鍵后就會(huì)保存內(nèi)容到文件并且隱藏輸入框,將新的名稱顯示在按鈕行

107、上</p><p><b>  {</b></p><p>  ui->lineEdit->hide();</p><p><b>  …………</b></p><p>  ui->pushButton->show();</p><p><b&g

108、t;  }</b></p><p>  void UserList::UpdateUserName(QString userName)//保存編輯好的信息到文件</p><p><b>  {</b></p><p>  QFile file("__showname.log");</p><p

109、>  //只寫的方式打開文件類型是文本文件,并且打開時(shí)清空文件如果文件不存在會(huì)自動(dòng)建立</p><p>  if(!file.open(QFile::WriteOnly | QFile::Text | QFile::Truncate))</p><p><b>  {</b></p><p><b>  ………</b>

110、;</p><p><b>  }</b></p><p>  QTextStream out(&file);//采用流寫入文件</p><p>  out<<userName;</p><p><b>  }</b></p><p> ?。?)視頻服務(wù)端

111、的啟動(dòng)</p><p>  視頻服務(wù)端的啟動(dòng)被定義在一個(gè)槽函數(shù)中當(dāng)用戶列表接收到響應(yīng)的信號(hào)后就直接通過執(zhí)行外部命令的的形式打開攝像頭服務(wù)端,并允許遠(yuǎn)程連接。</p><p>  connect(testprivate[privatechat_counter-1],SIGNAL(opencamera()),this,SLOT(openCamera()));//在每個(gè)私聊窗口打開的是后為其建立

112、一個(gè)信號(hào)和槽的連接。用于觸發(fā)槽函數(shù)。</p><p>  void UserList::openCamera()</p><p><b>  {</b></p><p>  if(videochat_counter<=0)</p><p><b>  {</b></p><

113、p>  videochat_counter=0;</p><p>  proc->start("./camera/bin/camera");</p><p>  videochat_counter++;</p><p><b>  }</b></p><p><b>  else

114、</b></p><p><b>  {</b></p><p>  videochat_counter++;</p><p><b>  }</b></p><p>  4.3.2私聊窗口模塊功能具體實(shí)現(xiàn)</p><p> ?。?)信息的輸入與發(fā)送私聊窗口為用戶

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論