freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于qt的局域網(wǎng)聊天系統(tǒng)設(shè)計(jì)論文(編輯修改稿)

2024-12-23 21:48 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 , QT 的 signals 關(guān)鍵字指出進(jìn)入了信號(hào)聲明區(qū),隨后即可 聲明自己的信號(hào)。例如,下面定義了三個(gè)信號(hào): void mySignal()。 void mySignal(int x)。 void mySignalParam(int x,int y)。 槽是普通的 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ì)于組件編程非常有用,你可以創(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)聲明的槽意味著只有類(lèi)自己可以將信號(hào)與之相連接。這適用于聯(lián)系非常緊密的類(lèi)。 信號(hào)與槽的關(guān)聯(lián) : 11 通過(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::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * member ) [static] 這個(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ì)象的話(huà),那么在 connect 調(diào)用中接收者參數(shù)可以省略。 當(dāng)信號(hào)與槽沒(méi)有必要繼續(xù)保持關(guān)聯(lián)時(shí),我們可以使用 disconnect 函數(shù)來(lái)斷開(kāi)發(fā)射者中的信號(hào)與接收者中的槽函數(shù)之間的關(guān)聯(lián)。其定義如下: bool QObject::disconnect ( const QObject * sender, const char * signal, const Object * receiver, const char * member ) [static] 元對(duì)象工具 : 元對(duì)象編譯器 moc( meta object piler) 對(duì) C++ 文件中的類(lèi)聲明進(jìn)行分析并產(chǎn)生用于初始化元對(duì)象的 C++ 代碼,元對(duì)象包含全部信號(hào)和槽的名字以及指向這些函數(shù)的指針。 moc 讀 C++ 源文件,如果發(fā)現(xiàn)有 Q_OBJECT 宏聲明的類(lèi),它就會(huì)生成另外一個(gè) C++ 源文件,這個(gè)新生成的文件中包含有該類(lèi)的元對(duì)象代碼。例如,假設(shè)我們有一個(gè)頭文件 ,在這個(gè)文件中包含有信號(hào)或槽的聲明,那么在編譯之前 moc 工具就會(huì)根據(jù)該文件自動(dòng)生成一個(gè) 名為 的 C++ 源文件并將其提交給編譯器;類(lèi)似地,對(duì)應(yīng)于 文件 moc 工具將自動(dòng)生成一個(gè)名為 文件提交給編譯器。 元對(duì)象代碼是 signal/slot 機(jī)制所必須的。用 moc 產(chǎn)生的 C++ 源文件必須與類(lèi)實(shí)現(xiàn)一起進(jìn)行編譯和連接,或者用 include 語(yǔ)句將其包含到類(lèi)的源文件中。 moc 并不擴(kuò)展 include 或者 define 宏定義 , 它只是簡(jiǎn)單的跳過(guò)所遇到的任何預(yù)處理指令。 信號(hào)與槽機(jī)制是比較靈 活的,但有些局限性我們必須了解,這樣在實(shí)際的使用過(guò)程中做到有的放矢,避免產(chǎn)生一些錯(cuò)誤。下面就介紹一下這方面的情況。 12 1 .信號(hào)與槽的效率是非常高的,但是同真正的回調(diào)函數(shù)比較起來(lái),由于增加了靈活性,因此在速度上還是有所損失,當(dāng)然這種損失相對(duì)來(lái)說(shuō)是比較小的,通過(guò)在一臺(tái) i586133 的機(jī)器上測(cè)試是 10 微秒(運(yùn)行 Linux),可見(jiàn)這種機(jī)制所提供的簡(jiǎn)潔性、靈活性還是值得的。但如果我們要追求高效率的話(huà),比如在實(shí)時(shí)系統(tǒng)中就要盡可能的少用這種機(jī)制。 2 .信號(hào)與槽機(jī)制與普通函數(shù)的調(diào)用一樣,如果使用不當(dāng)?shù)脑?huà),在程 序執(zhí)行時(shí)也有可能產(chǎn)生死循環(huán)。因此,在定義槽函數(shù)時(shí)一定要注意避免間接形成無(wú)限循環(huán),即在槽中再次發(fā)射所接收到的同樣信號(hào)。例如 , 在前面給出的例子中如果在 mySlot() 槽函數(shù)中加上語(yǔ)句 emit mySignal() 即可形成死循環(huán)。 3 .如果一個(gè)信號(hào)與多個(gè)槽相聯(lián)系的話(huà),那么,當(dāng)這個(gè)信號(hào)被發(fā)射時(shí),與之相關(guān)的槽被激活的順序?qū)⑹请S機(jī)的。 4. 宏定義不能用在 signal 和 slot 的參數(shù)中。 5. 構(gòu)造函數(shù)不能用在 signals 或者 slots 聲明區(qū)域內(nèi)。 6. 函數(shù)指針不能作為信號(hào)或槽的參數(shù)。 7. 信號(hào)與槽不能有缺省參數(shù)。 8. 信號(hào)與槽也不能攜帶模板類(lèi)參數(shù)。 9. 嵌套的類(lèi)不能位于信號(hào)或槽區(qū)域內(nèi),也不能有信號(hào)或者槽。 10. 友元聲明不能位于信號(hào)或者槽聲明區(qū)內(nèi)。 13 4 系統(tǒng)設(shè)計(jì) 系統(tǒng)總體構(gòu)架 本系統(tǒng)采用 c/s 構(gòu)架并以 Qt 技術(shù)為基礎(chǔ),實(shí)現(xiàn)局域網(wǎng)的聊天系統(tǒng)。系統(tǒng)要求能夠?qū)崿F(xiàn)聊天功能,能夠傳輸文件,并能夠更改字體大小和顏色及文字加粗傾斜和下劃線(xiàn)功能。 系統(tǒng)主體框架包括獲取用戶(hù)信息,系統(tǒng)界面設(shè)計(jì),消息發(fā)送及文件傳輸。系統(tǒng)要求完成的設(shè)計(jì)如下圖 2: 圖 2 系統(tǒng)的主要 功能模塊 Socket 運(yùn)用 文字聊天及文件傳輸是本設(shè)計(jì)功能實(shí)現(xiàn)的核心。 Qt 提供了 QTcpSocket 類(lèi),QTcpServer 類(lèi)和 QUdpSocket 類(lèi)等供開(kāi)發(fā)人員使用。 QTcpSocket 類(lèi)提供一個(gè) TCP 套接字,幫助開(kāi)發(fā)人員創(chuàng)建 TCP 連接和數(shù)據(jù)交流。 QTcpServer 類(lèi)用來(lái)與客戶(hù)端連線(xiàn),以實(shí)現(xiàn)數(shù)據(jù)的傳輸。 TCP 服務(wù)器及客戶(hù)端的數(shù)據(jù)交流流程如下圖 3: 14 圖 3數(shù)據(jù)交流流程圖 界面設(shè)計(jì) Qt擁有強(qiáng)大的 UI編輯器,開(kāi)發(fā)者可以很方便的構(gòu)架出系統(tǒng)的的圖形界面,再利用IDE編程實(shí) 現(xiàn)底層的信號(hào)和槽函數(shù)的設(shè)計(jì),具體的窗口部件如下圖 4所示: 圖 4主界面的部件 其中文字狀態(tài)又分為六個(gè)部分,即字體大小,字體選擇,字體加粗,字體傾斜,下劃線(xiàn)和字體顏色。用戶(hù)信息欄包括用戶(hù)名,主機(jī)名和用戶(hù) ID。消息狀態(tài)欄包括清除聊天記錄和保存聊天記錄兩個(gè)部分。當(dāng)傳輸文件時(shí)服務(wù)器端和客戶(hù)端都需要開(kāi)啟新的窗口。服務(wù)器端開(kāi)啟窗口顯示所要選擇發(fā)送的文件路徑,發(fā)送進(jìn)度,發(fā)送及退出按鈕。 窗口如下圖 5所示: 15 圖 5服務(wù)器端發(fā)送文件 客戶(hù)端作為文件的接受端,其窗口與服務(wù)器端相差無(wú)幾,主要由取消,關(guān)閉按鈕及等待 進(jìn)度構(gòu)成,具體窗口如下圖 6所示: 圖 6客戶(hù)端接收文件 16 5 設(shè)計(jì)實(shí)現(xiàn) 獲取用戶(hù)信息 QStringList 類(lèi)提供了一個(gè)字符串列表從 QList QString繼承而來(lái),它提供快速索引為基礎(chǔ)的接入以及快速插入和清除 。 其成員函數(shù)用于操作這個(gè)字符串列表如append(), insert(), replace(), removeAll(), removeAt(), removeFirst(), removeLast(), and removeOne()等 1. 增加字符串 QStringList fonts。 fonts Arial Helvetica Times Courier。 2. 合并字符串使用 join( ) QString str = (,)。 3. 拆分字符串 QString str = Arial, Helvetica, Times, Courier 。 QStringList list1 = (,)。 4. 索引 IndexOf() 函數(shù)返回給定字符 串的第一個(gè)出現(xiàn)的索引。 而 lastIndexOf() 函數(shù),返回字符串的最后一次出現(xiàn)的索引。 5. 替換 replaceInStrings() QStringList files。 files $QTDIR/src/moc/ ($QTDIR, /usr/lib/qt)。 6. 過(guò)濾 filter() 可以讓你提取一個(gè)新的列表只包含這些字符串包含一個(gè)特定的字符串(或匹配特定正則表達(dá)式): QStringList list。 list Bill Murray John Doe Bill Clinton。 QStringList result。 result = (Bill)。 // result: [Bill Murray, Bill Clinton 17 foreach 語(yǔ)句為數(shù)組或?qū)ο蠹现械拿總€(gè)元素重復(fù)一個(gè)嵌入語(yǔ)句組。 foreach 語(yǔ)句用于循環(huán)訪(fǎng)問(wèn)集合以獲取所需信息,但不應(yīng)用于更改集合內(nèi)容以避免產(chǎn)生不可預(yù)知的副作用。 Qprocess::systemenvironment() 返回當(dāng)前進(jìn)程的環(huán)境列表,即一個(gè)詳細(xì)的路徑,因此可以獲得用戶(hù)名。 QTableWidgetItem 用來(lái)表示表格中的一個(gè)單元格,正個(gè)表格都需要用逐個(gè)單元格構(gòu)建起來(lái)。 //處理新用戶(hù)加入 void Widget::newParticipant(QString userName,QString localHostName,QString ipAddress) { bool bb=uitableWidgetfindItems(localHostName, Qt::MatchExactly).isEmpty()。 if(bb) { QTableWidgetItem *user = new QTableWidgetItem(userName)。 QTableWidgetItem *host = new QTableWidgetItem(localHostName)。 QTableWidgetItem *ip = new QTableWidgetItem(ipAddress)。 uitableWidgetinsertRow(0)。 uitableWidgetsetItem(0,0,user)。 uitableWidgetsetItem(0,1,host)。 uitableWidgetsetItem(0,2,ip)。 uitextBrowsersetTextColor(Qt::gray)。 uitextBrowsersetCurrentFont(QFont(Times New Roman,10))。 uitextBrowserappend(tr(%1 在線(xiàn)! ).arg(userName))。 uionlineUsersetText(tr(在線(xiàn)人數(shù): %1).arg(uitableWidgetrowCount()))。 sendMessage(NewParticipant)。 } } 18 //獲取用戶(hù)名 QString Widget::getUserName() { QStringList envVariables。 envVariables USERNAME.* USER.* USERDOMAIN.* HOSTNAME.* DOMAINNAME.*。 QStringList environment = QProcess::systemEnvironment()。 foreach (QString string, envVariables) { int index = (QRegExp(string))。 if (index != 1) { QStringList stringList = (index).split(39。=39。)。 if (() == 2) { return (1)。 break。 } } } return false。 } //獲取 ip地址: QStrin
點(diǎn)擊復(fù)制文檔內(nèi)容
醫(yī)療健康相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1