




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、項(xiàng)目報(bào)告項(xiàng)目名稱輕量面向個(gè)人 IM 軟件完成時(shí)間總代碼量3300 行項(xiàng)目組長(zhǎng)小組成員成員分工自評(píng)成績(jī)(A/B/C)client.cpp,database.cpp,server.cpp,user.cppA曾chatwindow.cpp,discusswindow.cpp,login.cpp,main.cpp,registerwindows. cpp,user.cppA言Alert.cpp,searchwindow.cppB陶需求分析B需求分析一、需求概述:現(xiàn)在是一個(gè)信息 ,人們傳遞信息的方式已經(jīng)從過(guò)去的書(shū)信轉(zhuǎn)變?yōu)槭褂?,電腦等電子設(shè)備通過(guò) 進(jìn)行信息交流。因此,一個(gè)優(yōu)秀的聊天軟件對(duì)于每個(gè)人來(lái)說(shuō)必不
2、可少。然而,現(xiàn)在主流的即使通訊軟件如 , 等在軟件包含內(nèi)容上充斥了大量的 成份與大量無(wú)用信息,這會(huì)降低用戶在聊天中的使用體驗(yàn)。因此一個(gè)能夠?qū)崿F(xiàn)私聊,群聊的輕量級(jí)聊天軟件對(duì)廣大用戶來(lái)說(shuō)是必不可少的。本軟件是一款面向個(gè)人的基于服務(wù)器的 IM(Instant Messenger)軟件,提供基于廣域網(wǎng)的客戶端進(jìn)行文字傳輸、實(shí)時(shí)語(yǔ)音、文件傳輸。軟件系統(tǒng)采用 Client/Server 架構(gòu)。二、系統(tǒng)概述1.運(yùn)行環(huán)境:服務(wù)器:Windows Server 2008 R2 企業(yè)版 64 位數(shù)據(jù)庫(kù):MySQL基礎(chǔ)平臺(tái):Qt 5.90 2.系統(tǒng)結(jié)構(gòu):系統(tǒng)包括兩種終端:服務(wù)器端、客戶端服務(wù)器承擔(dān)客戶端驗(yàn)證,獲取好
3、友列表、聊天信息與文件的中轉(zhuǎn)??蛻舳撕头?wù)器之間進(jìn)行點(diǎn)對(duì)點(diǎn) TCP 通信,實(shí)現(xiàn)賬號(hào),賬號(hào)登陸,私聊和群聊功能3.關(guān)鍵通訊模式說(shuō)明: 客戶端與客戶端私聊客戶端 1服務(wù)器客戶端 2信息客戶端與客戶端群聊群組客戶端 1服務(wù)器客戶端 2客戶端 3三、系統(tǒng)功能組成用戶界面 客戶端功能客戶端與服務(wù)器 TCP 傳輸服務(wù)器數(shù)據(jù)庫(kù)搭建1. 用戶界面1.1 登陸界面界面要求優(yōu)先度賬號(hào)輸入高記住高總體界面要求優(yōu)先度窗口大小適應(yīng)分辨率高皮膚色彩更換中調(diào)節(jié)低信息自動(dòng)登錄中在上方嵌入 GIF 動(dòng)圖高在上方嵌入 OpenGL 動(dòng)畫(huà)低1.2界面1.3.人界面1.4 聊天界面界面要求優(yōu)先度人,群界面實(shí)現(xiàn)自由切換高人分組顯示高窗
4、口到邊緣時(shí)自動(dòng)浮現(xiàn)與隱藏中更換頭像低界面要求優(yōu)先度用圓點(diǎn)顯示高實(shí)現(xiàn)用戶名,賬號(hào)的輸入高個(gè)人信息輸入中1.5 查找與添加界面界面要求優(yōu)先度添加好友高添加群高創(chuàng)建群高界面要求優(yōu)先度并顯示文字消息高并顯示圖片消息高并語(yǔ)音消息中實(shí)現(xiàn)文件拖拽功能低1.6 設(shè)置界面1.7 托盤(pán)欄2. 客戶端功能2. 1 用戶登錄基本流程:用戶輸入用戶名、,然后點(diǎn)擊登錄按鈕。登陸后顯示主界面分支流程:1. 如果用戶沒(méi)有輸入用戶名,程序?qū)@示一條錯(cuò)誤消息,指出錯(cuò)誤并提示用戶輸入用戶名2. 如果用戶輸入的用戶名未被,程序提示用戶輸入的用戶名不3. 如果用戶輸入的用戶名錯(cuò)誤,程序?qū)@示一條錯(cuò)誤消息,指出錯(cuò)誤并提示用戶輸入正確的用
5、戶名和2.2基本流程:登陸界面有的,用戶點(diǎn)擊后程序自動(dòng)打卡界面。用戶輸入用戶名、賬號(hào)、,然后點(diǎn)擊按鈕。后自動(dòng)關(guān)閉界面,返回到登陸界面分支流程:1. 如果賬號(hào)已被,程序?qū)@示一條錯(cuò)誤消息,提示用戶更改賬號(hào)2. 如果賬號(hào)格式不合法程序?qū)@示一條錯(cuò)誤信息,提示用戶更改賬號(hào)界面要求優(yōu)先度托盤(pán)欄菜單高軟件隱藏至托盤(pán)欄高選擇狀態(tài)(離開(kāi),忙碌,)中可從托盤(pán)欄高界面要求優(yōu)先度基本設(shè)置(開(kāi)啟,關(guān)閉聲音)中基本設(shè)置(離開(kāi)與忙碌時(shí)自動(dòng)回復(fù))低2.3 添加好友基本流程:用戶點(diǎn)擊主界面中的添加界面后,將彈出添加界面。輸入要添加的好友的賬戶名,和添加理由。點(diǎn)擊添加按鈕后。程序?qū)⑾蛩砑拥暮糜寻l(fā)出一條申請(qǐng)驗(yàn)證彈窗,好友同
6、意后即添加好友 。分支流程:如果好友拒絕了添加好友申請(qǐng),那么即為添加好友失敗。添加好友的用戶會(huì)顯示好友申請(qǐng)被拒絕的彈窗。2.4 添加群基本流程:用戶點(diǎn)擊主界面中的添加界面后,將彈出添加界面。輸入要添加的群的群賬號(hào)。點(diǎn)擊添加按鈕后。程序?qū)⑷汗芾韱T發(fā)出一條申請(qǐng)驗(yàn)證彈窗,管理員同意后即添加好友。分支流程:如果群管理員拒絕了添加群申請(qǐng),那么即為添加群失敗。添加群的用戶會(huì)顯示群申請(qǐng)被拒絕的彈窗。2.5 創(chuàng)建群基本流程:用戶點(diǎn)擊主界面中的添加界面后,將彈出添加界面。用戶輸入群名、群賬號(hào)、,然后點(diǎn)擊創(chuàng)建群按鈕。創(chuàng)建后自動(dòng)關(guān)閉添加界面,返回到主界面。分支流程:1. 如果群賬號(hào)已被,程序?qū)@示一條錯(cuò)誤消息,提示
7、用戶更改賬號(hào)2. 如果群賬號(hào)格式不合法程序?qū)@示一條錯(cuò)誤信息,提示用戶更改賬號(hào)2.6 聊天 基本流程:用戶輸入聊天文字內(nèi)容,點(diǎn)擊,該消息即給對(duì)方。用戶點(diǎn)擊文件按鈕,將彈出選擇文件窗口,用戶選擇所要的文件后,該文件即給對(duì)方用戶長(zhǎng)按語(yǔ)言按鈕,程序?qū)㈤_(kāi)始錄制音頻。松開(kāi)按鈕后將把已經(jīng)錄好的消息給對(duì)方用戶點(diǎn)擊清屏按鈕,聊天窗口歷史被清除。分支流程:1. 如果沒(méi)有輸入信息,直接點(diǎn)擊。系統(tǒng)會(huì)提示錯(cuò)誤,請(qǐng)求輸入信息2. 如果用戶或者收到的文件是圖片,則該圖片將直接顯示在聊天窗口中2. 若用戶離線,則該消息,或文件儲(chǔ)存到服務(wù)器端的數(shù)據(jù)庫(kù),等用戶上線自動(dòng)將數(shù)據(jù)庫(kù)中的內(nèi)容給用戶。3. 處于托盤(pán)狀態(tài)時(shí),接收消息會(huì)有響
8、鈴提醒3.客戶端與服務(wù)器 TCP 傳輸3.1 經(jīng)服務(wù)器中轉(zhuǎn)的文字傳輸3.2 經(jīng)服務(wù)器中轉(zhuǎn)的文件傳輸3.3 離線文件的保存與再次4. 服務(wù)器數(shù)據(jù)庫(kù)搭建4.1 實(shí)現(xiàn)個(gè)人賬號(hào)信息的增刪改查4.2 實(shí)現(xiàn)群賬號(hào)信息的增刪改查4.3 離線消息的增刪查概要設(shè)計(jì)一、結(jié)構(gòu)圖及說(shuō)明模塊名模塊說(shuō)明數(shù)據(jù)庫(kù)存放用戶數(shù)據(jù),并提供,修改等接口服務(wù)器消息與文件處理將從客戶端接收到了消息進(jìn)行,并執(zhí)行該消息所要進(jìn)行的操作服務(wù)器端 TCP 傳輸與客戶端進(jìn)行直接的收發(fā)消息和文件操作客戶端 TCP 傳輸與服務(wù)器端進(jìn)行直接的收發(fā)消息和文件操作客戶端消息和文件處理將從服務(wù)器端接收到了消息進(jìn)行,并執(zhí)行該消息所要進(jìn)行的操作用戶主界面與用戶交互
9、,展示好友列表,群列表,頭像等信息消息提示界面與用戶交互,展示添加好友請(qǐng)求等消息聊天界面與用戶交互,可進(jìn)行字,發(fā)語(yǔ)音,發(fā)圖片,件等操作登陸界面與用戶交互,可進(jìn)行登陸操作界面與用戶交互,可進(jìn)行操作添加好友或群界面與用戶交互,可進(jìn)行添加好友或群操作二、類圖及說(shuō)明Database 類成員說(shuō)明:QSqlDatabase db保存數(shù)據(jù)庫(kù)連接信息bool createConnection() 創(chuàng)建數(shù)據(jù)庫(kù)bool createUserTable()創(chuàng)建總用戶表,來(lái)存放所有的賬號(hào)信息bool createGroupTable()創(chuàng)建總?cè)罕?,用?lái)存放群名信息bool createFriendTable(QStr
10、ing accountNumber)創(chuàng)建好友表,用來(lái)存放某個(gè)好友的所有好友信息bool createGroupMemberTable(QString groupNumber) 創(chuàng)建群成員表,用來(lái)存放某個(gè)群的所有群成員信息bool createMessageTable(QString accountNumber)創(chuàng)建離線消息表,用來(lái)暫存某個(gè)好友的離線信息bool addAccount(QString accountNumber,QString userName,QString passWord )增加賬戶QString getUserName(QString accountNumber)獲取某個(gè)
11、賬號(hào)用戶名QString getPassWord(QString accountNumber)獲取某個(gè)賬號(hào)的bool changeUserName(QString accountNumber,QString UserName)更改某個(gè)賬號(hào)用戶名bool changePassWord(QString accountNumber,QString passWord)更改某個(gè)賬號(hào)bool addFriend(QString myAccountNumber,QString friendAccountNumber)添加好友bool deleteFriend(QString myAccountNumber,
12、QString friendAccountNumber)刪除好友QString getFriendList(QString accountNumber)獲取好友列表bool addGroup(QString groupNumber)添加群QString getGroupList()獲得所有群名bool addGroupMember(QString groupNumber,QString memberaccountNumber)添加群成員QString getGroupMemberList(QString groupNumber)獲得群成員列表QString glGroupInformation
13、(QString accountNumber)獲得某個(gè)賬戶的所有群信息bool addMessage(QString accountNumber,QString messageText)增加離線消息QString getMessageList(QString accountNumber)獲取離線消息表bool deleteMessageList(QString accountNumber)清空暫存消息表Server 類成員說(shuō)明: QTcpServer *tcpServer 用來(lái)創(chuàng)建 TCP QList<User *> userList已連接用戶表,存放著所有用戶的信息Databas
14、e database數(shù)據(jù)庫(kù)類,對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作void analyseMessage(QString information,int i)對(duì)接到的信息類型做出,據(jù)此執(zhí)行不同的操作voidsendMessageToFriend(QStringsendAccountNumber,QStringinformation,QString recieveAccountNumber)向特定好友消息voidsendMessageToGroup(QStringsendAccountNumber,QStringinformation,QString groupNumber)向特定送消息void sendMessa
15、ge(QString infomation,QString accountNumber,int fromi=-1)直接消息 void readMessage() 直接消息void sendFileToFriend(QString fileName,QString accountNumber)把文件發(fā)給好友void readFile()文件void sendFileDirect(QString accountNumber)直接文件void addTolist()將新連接用戶加到 list 里void socketDisconnected() 用戶斷開(kāi)連接后的處理void startSendFil
16、e(QString fileName)開(kāi)始文件的信號(hào)user 類成員說(shuō)明: QString username 用戶名QString accountNumber賬號(hào)QTcpSocket *tcpsocket此用戶所對(duì)應(yīng)的 socketClient 類成員說(shuō)明:QString username用戶昵稱QString accountNumber用戶賬號(hào) QString password 用戶QString friendList 用戶好友信息QString groupList 用戶群信息QTcpSocket *tcpSocket儲(chǔ)存與服務(wù)器連接的 socket 信息void newConnect()建
17、立 TCP 連接void displayError(QAbstractSocket:SocketError)顯示 TCP錯(cuò)誤void getOldMessage()獲取離線消息好離線文件void login(QString User,QString Password)發(fā)出登陸申請(qǐng)void registerAccount(QString accountNumber,QString Password,QString userName)賬戶void sendMessage(QString infomation)消息void readMessage()消息void analyseMessage(QSt
18、ring information)對(duì)從服務(wù)器接收到的消息進(jìn)行處理void sendMessageToFriend(QString information,QString accountNumber)向好友發(fā)消息void sendMessageToGroup(QString information,QString groupNumber)向消息void sendFileToFriend(QString fileName,QString accountNumber)向好友文件void sendFileToSever(QString fileName,int fileType)向服務(wù)器文件 void
19、 readFile()文件QString openFile();打開(kāi)文件void sendFileDirect() 直接文件 QString getFriendList() 獲取本地好友列表void addFriend(QString accountNumber,QString addFriendReason)添加好友void deleteFriend(QString friendNumber)刪除好友QString getGroupList()獲取本地群列表void createGroup(QString groupNumber) 創(chuàng)建群void addGroupMember(QString
20、 groupNumber)添加群login 類成員說(shuō)明:float rat比率int startX,startY動(dòng)畫(huà)所需坐標(biāo)void loginSuccess(QString name)接受 client 發(fā)來(lái)的登陸消息,并打開(kāi)主界面窗口void on_pushButton_clicked()點(diǎn)擊登錄并通過(guò) client 向服務(wù)器發(fā)消息void on_pushButtion_clicked()點(diǎn)擊彈出窗口 void initialwindow() 初始化窗口void mousePressEvent(QMouseEvent*event) void mouseMouveEvent(QMouseEv
21、ent *event) void mouseReleaseEvent(QMouseEvent *evet) 以上三組函數(shù)實(shí)現(xiàn)鼠標(biāo)拖拽窗口void setrate()得到窗口比率registerwindow 類成員說(shuō)明void on_send_clicked()消息void initialwindow()初始化窗口mainwindow 類成員說(shuō)明QString myname的昵稱QString myid的賬號(hào)QWidget *flscro好友列表滾動(dòng)的范圍QScrollArea *fs好友列表可視的滾動(dòng)范圍 QList <chatwindow*>chatlist 好友列表信息QWid
22、get *glscro 群列表滾動(dòng)的范圍QScrollArea *gs群列表可視的滾動(dòng)范圍QList <discusswindow*>discusslist裙列表信息 QPropertAnimation *animation 邊框吸附的動(dòng)畫(huà)QSystemTratIcon *trayicon 托盤(pán)欄圖標(biāo)void setfriendlist(QString friendlist,QString myname)設(shè)置好友列表和昵稱void setgrouplist(QString grouplist,QString myname)設(shè)置群列表和昵稱void refresh(QString f
23、riendlist,QString grouplist,QString myname)刷新好友和群列表和昵稱void receiveMessage_fromfriend(QString message,QString accountNumber)接受來(lái)自好友消息void receiveMessage_fromgroup(QString sender,QString message,QString groupnumber)接受來(lái)自群的消息void chat()遍歷好友聊天框并選擇狀態(tài)為 on 的打開(kāi)void discuss()遍歷群聊天框并選擇狀態(tài)為 on 的打開(kāi)void exitPro()托盤(pán)
24、推出程序void showminiwindow()托盤(pán)最小化void changehead()改變頭像bool copyFileToPath(QString sourceDir,QString toDir,bool coverFileIfExist)將文件到指定目錄searchwindow 類成員說(shuō)明void on_search_btn_f_clicked()添加好友按鈕void on_btn_create_clicked()創(chuàng)建群按鈕void on_search_btn_g_clicked()添加群按鈕chatwindow 類成員說(shuō)明QPushButton* btn_fpi 頭像按鈕QLab
25、el *nam_fpi 好友昵稱QLabel*head好友頭像QPushButton*btn_del 刪除按鈕QString currentpath 當(dāng)前文件目錄 QString my_name的昵稱QString my_id的賬號(hào)QPushButton*display_cls 清屏按鈕QFile *record文件Record talkrecord 語(yǔ)音對(duì)象bool status_on狀態(tài)void receive_message(QString message)接受消息void receive_file(QString filename)接收文件void oppstatus() 窗口置于打開(kāi)
26、狀態(tài)void setrecord()消息void writerecord()保存void deletefriend()刪除好友void setid(QString id)傳入好友賬號(hào)alert 類成員說(shuō)明QString friendAccountNumber來(lái)自好友的賬號(hào)void mySetText(QString text)設(shè)置要顯示的內(nèi)容void mysetvisual(bool)按鈕不可見(jiàn)void initialwindow()窗口初始化disscusswindow 類成員說(shuō)明QPushButton* btn_gpi頭像按鈕QLabel *nam_gpi群名稱QString curren
27、tpath 當(dāng)前文件目錄 QString my_name的昵稱QString my_id的賬號(hào)QPushButton*display_cls 清屏按鈕QFile *record文件bool status_on 狀態(tài)void receive_message(QString message,QString name)接受消息void setmemberdisplay(QString)展示群友void oppstatus()窗口置于打開(kāi)狀態(tài)void setid(QString id)傳入賬號(hào)record 類成員說(shuō)明QString path文件路徑void startRecord()開(kāi)始void st
28、opRecord()結(jié)束void playRecord()關(guān)鍵數(shù)據(jù)結(jié)構(gòu)enum MessageInfo/ /客戶端發(fā)向服務(wù)器的消息類型LOGIN,/登陸REGISTER,/MESSAGE_TO_FRIEND,/發(fā)向好友的消息MESSAGE_TO_GROUP,/發(fā)向群的消息FILE_TO_FRIEND,/發(fā)向好友的文件FILE_TO_SERVER,/發(fā)向服務(wù)器的文件FILE_START_SEND,/客戶端傳來(lái)文件FILE_TO_GROUP,/發(fā)向群的文件GET_FRIEND_LIST,/獲取好友列表GET_GROUP_LIST,/獲取群列表GET_OLD_MESSAGE,/獲取離線消息ADD_F
29、RIEND,/添加好友ADD_FRIEND_DIRECT,/直接添加好友REJECT_ADD_FRIEND,/拒絕好友申請(qǐng)ADD_GROUP,/添加群CREAT_GROUP,/創(chuàng)建群DELETE_FRIEND,/刪除好友DELETE_GROUP,/刪除群CHANGE_LOGIN_STATUE,/更改登錄狀態(tài)CHANGE_USERNAME,/更改用戶名QUIT,/推出/ /服務(wù)器發(fā)向客戶端的消息類型LOGIN_SUCCESS ,/ 登錄LOGIN_FAIL,/ 登錄失敗HAVE_LOGINED,/ 已經(jīng)登錄REGISTER_SUCCESS,/ REGISTER_FAIL,/失敗CREATE_GR
30、OUP_SUCCESS,/創(chuàng)建群ADD_FRIEND_FAIL,/添加好友失敗ADD_FRIEND_SUCCESS,/添加好友ADD_GROUP_SUCCESS,/添加群DELETE_FRIEND_SUCCESS,/刪除好友DELETED_BY_FRIEND,/被好友刪除SEND_FRIEND_LIST,/好友列表MESSAGE_FROM_FRIEND,/來(lái)自好友消息MESSAGE_FROM_GROUP,/來(lái)自群消息FILE_FROM_FRIEND,/來(lái)自好友的文件FIEL_FROM_GROUP,/來(lái)自群的文件ADD_FRIEND_APPLICATION,/好友申請(qǐng)?zhí)砑?總用戶表 User&q
31、uot;create table User (accountNumber varchar(20) primary key, userName varchar(20),passWord varchar(20)"一個(gè)賬戶的賬號(hào),昵稱,為總用戶表的一條創(chuàng)建總?cè)罕?Groups"create table Groups (accountNumber varchar(20) primary key)"一個(gè)群的賬號(hào)為總?cè)罕淼囊粭l創(chuàng)建好友表 表名為賬號(hào)名QString("create table %1 (accountNumber varchar(20) primary
32、 key)").arg(accountNumber)某用戶的一個(gè)好友的賬號(hào)為好友表的一條創(chuàng)建群成員表 表名為群賬號(hào)名QString("createtable%1message(messageTextvarchar(400),messageTime varchar(40)").arg(accountNumber)某用群的一個(gè)群成員的賬號(hào)為群成員表的一條創(chuàng)建離線消息表 表名QString("create table %1message (messageText varchar(400),""messageTime varchar(40)&
33、quot;).arg(accountNumber)功能測(cè)試登陸界面,登陸功能正常。分辨率自適應(yīng)功能正常界面,功能正常主窗口添加好友或群。 添加好友功能正常如果對(duì)方離線,登陸后可以收到好友申請(qǐng)消息添加群功能正常創(chuàng)建群功能正常聊天功能正常,可以字,發(fā)圖片, 可以錄語(yǔ)音,發(fā)語(yǔ)音,放語(yǔ)音可以件可以清屏,保存,重新打開(kāi)程序后顯示上次的可以發(fā)離線消息,離線文件,圖片,語(yǔ)音實(shí)驗(yàn)小結(jié)一、出現(xiàn)的問(wèn)題1. 多客戶端之間的信息傳遞如果只是如同書(shū)上例子一樣單純的做個(gè)沒(méi)有賬戶概念,僅僅在兩個(gè)特定客戶端和服務(wù)器之間的消息收發(fā)的聊天軟件,那么實(shí)現(xiàn)起來(lái)會(huì)非常的容易。但是如果面向的 n 個(gè)客戶端,需要有賬戶的概念,那么就需要重
34、新設(shè)計(jì)消息的收發(fā)過(guò)程。所以,我們通過(guò)一個(gè)設(shè)計(jì)一個(gè)UserList 容器來(lái)存放不同的客戶端連接,定義了消息類型的枚舉,重構(gòu)了 sendMessage 與readMesage 的實(shí)現(xiàn)方式從而解決了多客戶端之間的信息傳遞問(wèn)題2. 服務(wù)器與客戶端文件傳輸文件如何在多個(gè)客戶端與服務(wù)器之間傳輸是一個(gè)問(wèn)題,因?yàn)槲募鬏斢袆e于消息傳輸, 不能單純把兩個(gè)模塊組合其來(lái)。為了解決這個(gè)問(wèn)題,我們?cè)O(shè)計(jì)了服務(wù)器與客戶端之間的文件傳輸過(guò)程。先通過(guò)幾輪的消息使雙方做好收文件和件的準(zhǔn)備,并開(kāi)始文件。文件接受完畢之后再通過(guò)消息結(jié)束收件的狀態(tài)。3. 離線消息與文件的實(shí)現(xiàn)TCP 下消息的傳遞的基礎(chǔ)是雙方都是 狀態(tài)。但在實(shí)際生活中消息
35、的接收者可能不是 狀態(tài)。這就需要服務(wù)器儲(chǔ)存這些離線消息到數(shù)據(jù)庫(kù)中,儲(chǔ)存文件到服務(wù)器端,待用戶登錄后再將從數(shù)據(jù)中把離線消息和離線文件提取并 給用戶。因此,我們精心設(shè)計(jì)一種服務(wù)器與客戶端的握手方式,使離線消息和文件能夠讓客戶端順利的接受,處理,并做出可能的應(yīng)答。4. 數(shù)據(jù)庫(kù)的語(yǔ)句的執(zhí)行在編寫(xiě)這個(gè)數(shù)據(jù)庫(kù)時(shí),由于是第一次寫(xiě) SQL,所以犯了很多錯(cuò)誤。數(shù)據(jù)庫(kù)建表的時(shí), 表的名字不能和數(shù)據(jù)庫(kù)的關(guān)鍵字(如 group)重復(fù),否則就會(huì)出現(xiàn)異常。在拼湊數(shù)據(jù)庫(kù)要執(zhí)行的語(yǔ)句時(shí), 的字符串?dāng)?shù)據(jù)要用單引號(hào)括起來(lái),因?yàn)槠礈愡M(jìn)去的只是字符串里頭的文字內(nèi)容。5. 中文亂碼問(wèn)題我們?cè)诰帉?xiě)客戶端界面時(shí),出現(xiàn)了顯示中文字體亂碼的問(wèn)
36、題。雖然這看起來(lái)是一個(gè)小問(wèn)題,但它確實(shí)困擾了我們很久。最終的解決辦法是將全部代碼 進(jìn)記事本,另存 UTF-8 后再將其打開(kāi)代碼再 會(huì)原 ,即進(jìn)行了一次轉(zhuǎn)碼。然后在源程序里設(shè)置字符串格式同為 UTF-8,即添加語(yǔ)句 QTextCodec *codec=QTextCodec:codecForName("UTF-8")。二、感悟體會(huì)1、全局變量全局變量要盡可能的少用,除非萬(wàn)不得已。全局變量破壞了函數(shù),類的封裝性能,降低了代碼的可移植性,也影響了程序的可讀性。這一點(diǎn)在幾百行的 或許體現(xiàn)不出來(lái),但在實(shí)踐課程團(tuán)隊(duì)項(xiàng)目的幾千行代碼的項(xiàng)目中我確實(shí)感受到了他的意義。除非萬(wàn)不得已,不要使用2、
37、程序的架構(gòu)一個(gè)程序可以從邏輯層抽象出不同的模塊,不同的模塊實(shí)現(xiàn)著不同的功能。因此,如果把屬于不同模塊的函數(shù)放到合適的不同的文件中。這可以降低不同模塊與函數(shù)的耦合度,將項(xiàng)目不同的模塊進(jìn)行 的編寫(xiě)與測(cè)試,也方便功能的修改與添加。因此,程序的架構(gòu)是至關(guān)重要的。3、代碼規(guī)范注釋是極為重要的,無(wú)論在那個(gè)階段注釋都很有用用枚舉來(lái)代表信息類型或者狀態(tài),既會(huì)大大提高程序的開(kāi)讀性,也可以用于 switch-case項(xiàng)目代碼alert.h#ifndef ALERT_H#define ALERT_H#include <QDialog> #include <QString>#include &
38、lt;QDesktopWidget> #include "client.h" #include"messageenum.h"extern Client * client;namespace Ui class Alert;class Alert : public QDialogQ_OBJECTpublic:explicit Alert(QWidget *parent = 0);Alert();void mySetText(QString text);void mysetvisual(bool);/按鈕可視化QString friendAccountN
39、umber;private slots:void on_btn_accept_clicked();void on_btn_refuse_clicked();語(yǔ)句中多人開(kāi)發(fā)需要一個(gè)統(tǒng)一的代碼風(fēng)格,如均用駝峰命名法,函數(shù)作用是賦值就起 set , 是拿值就起 getxx。如果有了一個(gè)相對(duì)統(tǒng)一的代碼風(fēng)格,這會(huì)在和代碼階段起著一個(gè)非常重要的幫助。4、明確需求需求要盡可能的明確、清晰,初次做項(xiàng)目總是想著馬上上手去寫(xiě)一些代碼或者拉出一些布局然而心里只有一個(gè)模糊的預(yù)期。以至于在不重要的細(xì)節(jié)處糾纏許久,且寫(xiě)出的界面不符合最后的期望需要重寫(xiě),耽誤了進(jìn)度,而且沒(méi)有清晰的需求則讓人遇到比較麻煩的問(wèn)題時(shí)容易放棄造成工
40、程質(zhì)量的下降。因此,明確需求對(duì)項(xiàng)目是十分的重要的,而且要要在動(dòng)手寫(xiě)代碼之前就已經(jīng)明確void on_btn_close_clicked();void on_btn_close_pressed();void on_btn_close_released();private:Ui:Alert *ui;void initialwindow(); void setrate();float rat;#endif / ALERT_Halert.cpp#include "alert.h" #include "ui_alert.h"Alert:Alert(QWidget
41、*parent) : QDialog(parent),ui(new Ui:Alert)ui->setupUi(this); initialwindow();Alert:Alert()delete ui;void Alert:initialwindow() setrate();setWindowFlag(Qt:FramelessWindowHint); setGeometry(880*rat,500*rat,400*rat,300*rat); setStyleSheet("background-color:rgb(235,242,249)");ui->btn_cl
42、ose->setGeometry(370*rat,0,30*rat,30*rat);ui->btn_close->setStyleSheet("#btn_closeborder-image:url(:/basepicture/close.png);background- size:contain");ui->text->setStyleSheet("background-color:transparent;border:none");ui->text->setGeometry(40*rat,40*rat,320*
43、rat,170*rat);ui->btn_accept->setStyleSheet("background-color:rgb(9,163,220);color:white;border-radius:8px");ui->btn_accept->setGeometry(60*rat,230*rat,80*rat,30*rat);ui->btn_refuse->setStyleSheet("background-color:rgb(9,163,220);color:white;border-radius:8px");u
44、i->btn_refuse->setGeometry(260*rat,230*rat,80*rat,30*rat);void Alert:mySetText(QString text)ui->text->setText(text);void Alert:mysetvisual(bool k)ui->btn_accept->setVisible(k); ui->btn_refuse->setVisible(k);void Alert:on_btn_accept_clicked()qDebug()<<"on_btn_accept
45、_clicked"QString message=QString:number(ADD_FRIEND_DIRECT)+tr("")+friendAccountNumber;emit client->messageToServer(message); this->close();void Alert:on_btn_refuse_clicked()QString message=QString:number(REJECT_ADD_FRIEND)+tr("")+friendAccountNumber;client->sendMess
46、age(message); this->close();void Alert:setrate()QDesktopWidget *desktopWidget=QApplication:desktop(); QRect screenRect=desktopWidget->screenGeometry(); rat=screenRect.width()*1.0/1280;void Alert:on_btn_close_clicked()this->close();void Alert:on_btn_close_pressed()ui->btn_close->setSty
47、leSheet("#btn_closeborder-image:url(:/basepicture/close_press.png);backgr ound-size:contain");void Alert:on_btn_close_released()ui->btn_close->setStyleSheet("#btn_closeborder-image:url(:/basepicture/close.png);background- size:contain");chatwindow.h#ifndef CHATWINDOW_H#defi
48、ne CHATWINDOW_H#include <QDialog> #include <QDesktopWidget> #include <QMouseEvent> #include <QString>#include <QLabel> #include <QTime> #include <QTextEdit> #include <QTextCodec> #include <QDateTime>#include <QFile>#include <Q#include &l
49、t;QList>>#include <QPushButton> #include <QDebug> #include <QDir> #include"client.h" #include "record.h" extern Client * client; namespace Ui class chatwindow;class chatwindow : public QDialogQ_OBJECTpublic:explicit chatwindow(QWidget *parent = 0);chatwind
50、ow();QString getid();/id 好友賬號(hào)QString gettitle();void setid(QString account);void settitle(QString title);/好友昵稱void setstatuson();void setstatusoff(); bool readstatus();void setmy_name(QString account,QString name); QPushButton* btn_fpi;/頭像按鈕QLabel* name_fpi;/好友昵稱QLabel*head;/頭像QPushButton* btn_del;v
51、oid receive_message(QString message); void receive_file(QString filename); QString friend_name;QList <QPushButton*> filelist;QString current_path;private slots:void on_btn_cl_clicked(); void oppstatus();void on_send_clicked(); void setrecord();/void writerecord();/保存void display_clear();/清屏voi
52、d on_sendfile_clicked();void on_btn_mi_clicked();void on_start_pressed();void on_start_released();void deletefriend();private:Ui:chatwindow *ui; void initialwindow();void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); bool pr
53、essflag=false;QPoint startpos; void setrate();float rat;QString my_name;/QString my_id;/的賬戶名的賬號(hào)QPushButton *display_cls;/清屏按鈕QFile *record; /Record talkrecord;bool status_on=false;/是否打開(kāi)QString id;/賬號(hào)QString title;/標(biāo)題QLabel *labtitle;#endif / CHATWINDOW_Hchatwindow.cpp#include "chatwindow.h"
54、; #include "ui_chatwindow.h"chatwindow:chatwindow(QWidget *parent) : QDialog(parent),ui(new Ui:chatwindow)record=0;ui->setupUi(this); initialwindow();ui->display->signment(Qt:AlignLeft);chatwindow:chatwindow()delete ui;void chatwindow:initialwindow()current_path=QDir:currentPath()
55、; setrate();setWindowFlag(Qt:FramelessWindowHint); setWindowOpacity(0.9);this->setStyleSheet("background-color:rgb(235,242,249)");ui->display->setStyleSheet("#displaybackground-color:transparent"); setGeometry(490*rat,175*rat,500*rat,450*rat);ui->start->setGeometry(100*rat,300*rat,80*rat,20*rat);ui->start->setText("開(kāi)始");ui->btn_cl->setGeometry(470*rat,0,30*rat,30*rat);ui->btn_cl->setStyleSheet("border-image:url(:/basepicture/close.png)"); ui->btn_mi->setGeometry(440*rat,0,30*rat,30*rat);ui->btn_mi->setStyle
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 鈑金安全考試題及答案
- 安全技術(shù)試題及答案
- 安全管護(hù)培訓(xùn)試題及答案
- 不良資產(chǎn)處置行業(yè)創(chuàng)新模式與市場(chǎng)拓展路徑研究報(bào)告
- 便利店智能支付與無(wú)感購(gòu)物體驗(yàn)研究報(bào)告(2025年)
- 門(mén)店運(yùn)營(yíng)課程培訓(xùn)課件
- 中國(guó)南方地區(qū)課件
- 中國(guó)單一制課件
- 護(hù)理文書(shū)書(shū)寫(xiě)規(guī)范
- 原發(fā)性肝癌護(hù)理課件
- 公安院校公安專業(yè)招生政治考察表在校表現(xiàn)考察表面試表
- 教學(xué)設(shè)計(jì)培訓(xùn)課件
- 托克遜縣寶源長(zhǎng)石礦廠新疆托克遜縣桑樹(shù)園子南山銅礦3萬(wàn)噸/年采礦項(xiàng)目環(huán)評(píng)報(bào)告
- 陜西省西安高中2025屆高二化學(xué)第二學(xué)期期末達(dá)標(biāo)檢測(cè)試題含解析
- (2025)《公共基礎(chǔ)知識(shí)》試真題庫(kù)與答案
- 江西省南昌市第一中學(xué)教育集團(tuán)2023-2024學(xué)年八年級(jí)下學(xué)期數(shù)學(xué)期末試卷(含答案)
- 2025盤(pán)錦市雙臺(tái)子區(qū)輔警考試試卷真題
- 教研員考試題庫(kù)及答案
- 關(guān)于衛(wèi)生院“十五五”發(fā)展規(guī)劃(完整本)
- 地生中考模擬試題及答案
- 慢性病管理中心建設(shè)實(shí)施方案
評(píng)論
0/150
提交評(píng)論