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

正文內(nèi)容

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

2024-12-23 21:48 本頁面
 

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