




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、項目報告項目名稱輕量面向個人 IM 軟件完成時間總代碼量3300 行項目組長小組成員成員分工自評成績(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)在是一個信息 ,人們傳遞信息的方式已經(jīng)從過去的書信轉(zhuǎn)變?yōu)槭褂?,電腦等電子設(shè)備通過 進(jìn)行信息交流。因此,一個優(yōu)秀的聊天軟件對于每個人來說必不
2、可少。然而,現(xiàn)在主流的即使通訊軟件如 , 等在軟件包含內(nèi)容上充斥了大量的 成份與大量無用信息,這會降低用戶在聊天中的使用體驗(yàn)。因此一個能夠?qū)崿F(xiàn)私聊,群聊的輕量級聊天軟件對廣大用戶來說是必不可少的。本軟件是一款面向個人的基于服務(wù)器的 IM(Instant Messenger)軟件,提供基于廣域網(wǎng)的客戶端進(jìn)行文字傳輸、實(shí)時語音、文件傳輸。軟件系統(tǒng)采用 Client/Server 架構(gòu)。二、系統(tǒng)概述1.運(yùn)行環(huán)境:服務(wù)器:Windows Server 2008 R2 企業(yè)版 64 位數(shù)據(jù)庫:MySQL基礎(chǔ)平臺: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)對點(diǎn) TCP 通信,實(shí)現(xiàn)賬號,賬號登陸,私聊和群聊功能3.關(guān)鍵通訊模式說明: 客戶端與客戶端私聊客戶端 1服務(wù)器客戶端 2信息客戶端與客戶端群聊群組客戶端 1服務(wù)器客戶端 2客戶端 3三、系統(tǒng)功能組成用戶界面 客戶端功能客戶端與服務(wù)器 TCP 傳輸服務(wù)器數(shù)據(jù)庫搭建1. 用戶界面1.1 登陸界面界面要求優(yōu)先度賬號輸入高記住高總體界面要求優(yōu)先度窗口大小適應(yīng)分辨率高皮膚色彩更換中調(diào)節(jié)低信息自動登錄中在上方嵌入 GIF 動圖高在上方嵌入 OpenGL 動畫低1.2界面1.3.人界面1.4 聊天界面界面要求優(yōu)先度人,群界面實(shí)現(xiàn)自由切換高人分組顯示高窗
4、口到邊緣時自動浮現(xiàn)與隱藏中更換頭像低界面要求優(yōu)先度用圓點(diǎn)顯示高實(shí)現(xiàn)用戶名,賬號的輸入高個人信息輸入中1.5 查找與添加界面界面要求優(yōu)先度添加好友高添加群高創(chuàng)建群高界面要求優(yōu)先度并顯示文字消息高并顯示圖片消息高并語音消息中實(shí)現(xiàn)文件拖拽功能低1.6 設(shè)置界面1.7 托盤欄2. 客戶端功能2. 1 用戶登錄基本流程:用戶輸入用戶名、,然后點(diǎn)擊登錄按鈕。登陸后顯示主界面分支流程:1. 如果用戶沒有輸入用戶名,程序?qū)@示一條錯誤消息,指出錯誤并提示用戶輸入用戶名2. 如果用戶輸入的用戶名未被,程序提示用戶輸入的用戶名不3. 如果用戶輸入的用戶名錯誤,程序?qū)@示一條錯誤消息,指出錯誤并提示用戶輸入正確的用
5、戶名和2.2基本流程:登陸界面有的,用戶點(diǎn)擊后程序自動打卡界面。用戶輸入用戶名、賬號、,然后點(diǎn)擊按鈕。后自動關(guān)閉界面,返回到登陸界面分支流程:1. 如果賬號已被,程序?qū)@示一條錯誤消息,提示用戶更改賬號2. 如果賬號格式不合法程序?qū)@示一條錯誤信息,提示用戶更改賬號界面要求優(yōu)先度托盤欄菜單高軟件隱藏至托盤欄高選擇狀態(tài)(離開,忙碌,)中可從托盤欄高界面要求優(yōu)先度基本設(shè)置(開啟,關(guān)閉聲音)中基本設(shè)置(離開與忙碌時自動回復(fù))低2.3 添加好友基本流程:用戶點(diǎn)擊主界面中的添加界面后,將彈出添加界面。輸入要添加的好友的賬戶名,和添加理由。點(diǎn)擊添加按鈕后。程序?qū)⑾蛩砑拥暮糜寻l(fā)出一條申請驗(yàn)證彈窗,好友同
6、意后即添加好友 。分支流程:如果好友拒絕了添加好友申請,那么即為添加好友失敗。添加好友的用戶會顯示好友申請被拒絕的彈窗。2.4 添加群基本流程:用戶點(diǎn)擊主界面中的添加界面后,將彈出添加界面。輸入要添加的群的群賬號。點(diǎn)擊添加按鈕后。程序?qū)⑷汗芾韱T發(fā)出一條申請驗(yàn)證彈窗,管理員同意后即添加好友。分支流程:如果群管理員拒絕了添加群申請,那么即為添加群失敗。添加群的用戶會顯示群申請被拒絕的彈窗。2.5 創(chuàng)建群基本流程:用戶點(diǎn)擊主界面中的添加界面后,將彈出添加界面。用戶輸入群名、群賬號、,然后點(diǎn)擊創(chuàng)建群按鈕。創(chuàng)建后自動關(guān)閉添加界面,返回到主界面。分支流程:1. 如果群賬號已被,程序?qū)@示一條錯誤消息,提示
7、用戶更改賬號2. 如果群賬號格式不合法程序?qū)@示一條錯誤信息,提示用戶更改賬號2.6 聊天 基本流程:用戶輸入聊天文字內(nèi)容,點(diǎn)擊,該消息即給對方。用戶點(diǎn)擊文件按鈕,將彈出選擇文件窗口,用戶選擇所要的文件后,該文件即給對方用戶長按語言按鈕,程序?qū)㈤_始錄制音頻。松開按鈕后將把已經(jīng)錄好的消息給對方用戶點(diǎn)擊清屏按鈕,聊天窗口歷史被清除。分支流程:1. 如果沒有輸入信息,直接點(diǎn)擊。系統(tǒng)會提示錯誤,請求輸入信息2. 如果用戶或者收到的文件是圖片,則該圖片將直接顯示在聊天窗口中2. 若用戶離線,則該消息,或文件儲存到服務(wù)器端的數(shù)據(jù)庫,等用戶上線自動將數(shù)據(jù)庫中的內(nèi)容給用戶。3. 處于托盤狀態(tài)時,接收消息會有響
8、鈴提醒3.客戶端與服務(wù)器 TCP 傳輸3.1 經(jīng)服務(wù)器中轉(zhuǎn)的文字傳輸3.2 經(jīng)服務(wù)器中轉(zhuǎn)的文件傳輸3.3 離線文件的保存與再次4. 服務(wù)器數(shù)據(jù)庫搭建4.1 實(shí)現(xiàn)個人賬號信息的增刪改查4.2 實(shí)現(xiàn)群賬號信息的增刪改查4.3 離線消息的增刪查概要設(shè)計一、結(jié)構(gòu)圖及說明模塊名模塊說明數(shù)據(jù)庫存放用戶數(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、,展示好友列表,群列表,頭像等信息消息提示界面與用戶交互,展示添加好友請求等消息聊天界面與用戶交互,可進(jìn)行字,發(fā)語音,發(fā)圖片,件等操作登陸界面與用戶交互,可進(jìn)行登陸操作界面與用戶交互,可進(jìn)行操作添加好友或群界面與用戶交互,可進(jìn)行添加好友或群操作二、類圖及說明Database 類成員說明:QSqlDatabase db保存數(shù)據(jù)庫連接信息bool createConnection() 創(chuàng)建數(shù)據(jù)庫bool createUserTable()創(chuàng)建總用戶表,來存放所有的賬號信息bool createGroupTable()創(chuàng)建總?cè)罕?,用來存放群名信息bool createFriendTable(QStr
10、ing accountNumber)創(chuàng)建好友表,用來存放某個好友的所有好友信息bool createGroupMemberTable(QString groupNumber) 創(chuàng)建群成員表,用來存放某個群的所有群成員信息bool createMessageTable(QString accountNumber)創(chuàng)建離線消息表,用來暫存某個好友的離線信息bool addAccount(QString accountNumber,QString userName,QString passWord )增加賬戶QString getUserName(QString accountNumber)獲取某個
11、賬號用戶名QString getPassWord(QString accountNumber)獲取某個賬號的bool changeUserName(QString accountNumber,QString UserName)更改某個賬號用戶名bool changePassWord(QString accountNumber,QString passWord)更改某個賬號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)獲得某個賬戶的所有群信息bool addMessage(QString accountNumber,QString messageText)增加離線消息QString getMessageList(QString accountNumber)獲取離線消息表bool deleteMessageList(QString accountNumber)清空暫存消息表Server 類成員說明: QTcpServer *tcpServer 用來創(chuàng)建 TCP QList<User *> userList已連接用戶表,存放著所有用戶的信息Databas
14、e database數(shù)據(jù)庫類,對數(shù)據(jù)庫進(jìn)行操作void analyseMessage(QString information,int i)對接到的信息類型做出,據(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() 用戶斷開連接后的處理void startSendFil
16、e(QString fileName)開始文件的信號user 類成員說明: QString username 用戶名QString accountNumber賬號QTcpSocket *tcpsocket此用戶所對應(yīng)的 socketClient 類成員說明:QString username用戶昵稱QString accountNumber用戶賬號 QString password 用戶QString friendList 用戶好友信息QString groupList 用戶群信息QTcpSocket *tcpSocket儲存與服務(wù)器連接的 socket 信息void newConnect()建
17、立 TCP 連接void displayError(QAbstractSocket:SocketError)顯示 TCP錯誤void getOldMessage()獲取離線消息好離線文件void login(QString User,QString Password)發(fā)出登陸申請void registerAccount(QString accountNumber,QString Password,QString userName)賬戶void sendMessage(QString infomation)消息void readMessage()消息void analyseMessage(QSt
18、ring information)對從服務(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();打開文件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 類成員說明:float rat比率int startX,startY動畫所需坐標(biāo)void loginSuccess(QString name)接受 client 發(fā)來的登陸消息,并打開主界面窗口void on_pushButton_clicked()點(diǎn)擊登錄并通過 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 類成員說明void on_send_clicked()消息void initialwindow()初始化窗口mainwindow 類成員說明QString myname的昵稱QString myid的賬號QWidget *flscro好友列表滾動的范圍QScrollArea *fs好友列表可視的滾動范圍 QList <chatwindow*>chatlist 好友列表信息QWid
22、get *glscro 群列表滾動的范圍QScrollArea *gs群列表可視的滾動范圍QList <discusswindow*>discusslist裙列表信息 QPropertAnimation *animation 邊框吸附的動畫QSystemTratIcon *trayicon 托盤欄圖標(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)接受來自好友消息void receiveMessage_fromgroup(QString sender,QString message,QString groupnumber)接受來自群的消息void chat()遍歷好友聊天框并選擇狀態(tài)為 on 的打開void discuss()遍歷群聊天框并選擇狀態(tài)為 on 的打開void exitPro()托盤
24、推出程序void showminiwindow()托盤最小化void changehead()改變頭像bool copyFileToPath(QString sourceDir,QString toDir,bool coverFileIfExist)將文件到指定目錄searchwindow 類成員說明void on_search_btn_f_clicked()添加好友按鈕void on_btn_create_clicked()創(chuàng)建群按鈕void on_search_btn_g_clicked()添加群按鈕chatwindow 類成員說明QPushButton* btn_fpi 頭像按鈕QLab
25、el *nam_fpi 好友昵稱QLabel*head好友頭像QPushButton*btn_del 刪除按鈕QString currentpath 當(dāng)前文件目錄 QString my_name的昵稱QString my_id的賬號QPushButton*display_cls 清屏按鈕QFile *record文件Record talkrecord 語音對象bool status_on狀態(tài)void receive_message(QString message)接受消息void receive_file(QString filename)接收文件void oppstatus() 窗口置于打開
26、狀態(tài)void setrecord()消息void writerecord()保存void deletefriend()刪除好友void setid(QString id)傳入好友賬號alert 類成員說明QString friendAccountNumber來自好友的賬號void mySetText(QString text)設(shè)置要顯示的內(nèi)容void mysetvisual(bool)按鈕不可見void initialwindow()窗口初始化disscusswindow 類成員說明QPushButton* btn_gpi頭像按鈕QLabel *nam_gpi群名稱QString curren
27、tpath 當(dāng)前文件目錄 QString my_name的昵稱QString my_id的賬號QPushButton*display_cls 清屏按鈕QFile *record文件bool status_on 狀態(tài)void receive_message(QString message,QString name)接受消息void setmemberdisplay(QString)展示群友void oppstatus()窗口置于打開狀態(tài)void setid(QString id)傳入賬號record 類成員說明QString path文件路徑void startRecord()開始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,/客戶端傳來文件FILE_TO_GROUP,/發(fā)向群的文件GET_FRIEND_LIST,/獲取好友列表GET_GROUP_LIST,/獲取群列表GET_OLD_MESSAGE,/獲取離線消息ADD_F
29、RIEND,/添加好友ADD_FRIEND_DIRECT,/直接添加好友REJECT_ADD_FRIEND,/拒絕好友申請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,/來自好友消息MESSAGE_FROM_GROUP,/來自群消息FILE_FROM_FRIEND,/來自好友的文件FIEL_FROM_GROUP,/來自群的文件ADD_FRIEND_APPLICATION,/好友申請?zhí)砑?總用戶表 User&q
31、uot;create table User (accountNumber varchar(20) primary key, userName varchar(20),passWord varchar(20)"一個賬戶的賬號,昵稱,為總用戶表的一條創(chuàng)建總?cè)罕?Groups"create table Groups (accountNumber varchar(20) primary key)"一個群的賬號為總?cè)罕淼囊粭l創(chuàng)建好友表 表名為賬號名QString("create table %1 (accountNumber varchar(20) primary
32、 key)").arg(accountNumber)某用戶的一個好友的賬號為好友表的一條創(chuàng)建群成員表 表名為群賬號名QString("createtable%1message(messageTextvarchar(400),messageTime varchar(40)").arg(accountNumber)某用群的一個群成員的賬號為群成員表的一條創(chuàng)建離線消息表 表名QString("create table %1message (messageText varchar(400),""messageTime varchar(40)&
33、quot;).arg(accountNumber)功能測試登陸界面,登陸功能正常。分辨率自適應(yīng)功能正常界面,功能正常主窗口添加好友或群。 添加好友功能正常如果對方離線,登陸后可以收到好友申請消息添加群功能正常創(chuàng)建群功能正常聊天功能正常,可以字,發(fā)圖片, 可以錄語音,發(fā)語音,放語音可以件可以清屏,保存,重新打開程序后顯示上次的可以發(fā)離線消息,離線文件,圖片,語音實(shí)驗(yàn)小結(jié)一、出現(xiàn)的問題1. 多客戶端之間的信息傳遞如果只是如同書上例子一樣單純的做個沒有賬戶概念,僅僅在兩個特定客戶端和服務(wù)器之間的消息收發(fā)的聊天軟件,那么實(shí)現(xiàn)起來會非常的容易。但是如果面向的 n 個客戶端,需要有賬戶的概念,那么就需要重
34、新設(shè)計消息的收發(fā)過程。所以,我們通過一個設(shè)計一個UserList 容器來存放不同的客戶端連接,定義了消息類型的枚舉,重構(gòu)了 sendMessage 與readMesage 的實(shí)現(xiàn)方式從而解決了多客戶端之間的信息傳遞問題2. 服務(wù)器與客戶端文件傳輸文件如何在多個客戶端與服務(wù)器之間傳輸是一個問題,因?yàn)槲募鬏斢袆e于消息傳輸, 不能單純把兩個模塊組合其來。為了解決這個問題,我們設(shè)計了服務(wù)器與客戶端之間的文件傳輸過程。先通過幾輪的消息使雙方做好收文件和件的準(zhǔn)備,并開始文件。文件接受完畢之后再通過消息結(jié)束收件的狀態(tài)。3. 離線消息與文件的實(shí)現(xiàn)TCP 下消息的傳遞的基礎(chǔ)是雙方都是 狀態(tài)。但在實(shí)際生活中消息
35、的接收者可能不是 狀態(tài)。這就需要服務(wù)器儲存這些離線消息到數(shù)據(jù)庫中,儲存文件到服務(wù)器端,待用戶登錄后再將從數(shù)據(jù)中把離線消息和離線文件提取并 給用戶。因此,我們精心設(shè)計一種服務(wù)器與客戶端的握手方式,使離線消息和文件能夠讓客戶端順利的接受,處理,并做出可能的應(yīng)答。4. 數(shù)據(jù)庫的語句的執(zhí)行在編寫這個數(shù)據(jù)庫時,由于是第一次寫 SQL,所以犯了很多錯誤。數(shù)據(jù)庫建表的時, 表的名字不能和數(shù)據(jù)庫的關(guān)鍵字(如 group)重復(fù),否則就會出現(xiàn)異常。在拼湊數(shù)據(jù)庫要執(zhí)行的語句時, 的字符串?dāng)?shù)據(jù)要用單引號括起來,因?yàn)槠礈愡M(jìn)去的只是字符串里頭的文字內(nèi)容。5. 中文亂碼問題我們在編寫客戶端界面時,出現(xiàn)了顯示中文字體亂碼的問
36、題。雖然這看起來是一個小問題,但它確實(shí)困擾了我們很久。最終的解決辦法是將全部代碼 進(jìn)記事本,另存 UTF-8 后再將其打開代碼再 會原 ,即進(jìn)行了一次轉(zhuǎn)碼。然后在源程序里設(shè)置字符串格式同為 UTF-8,即添加語句 QTextCodec *codec=QTextCodec:codecForName("UTF-8")。二、感悟體會1、全局變量全局變量要盡可能的少用,除非萬不得已。全局變量破壞了函數(shù),類的封裝性能,降低了代碼的可移植性,也影響了程序的可讀性。這一點(diǎn)在幾百行的 或許體現(xiàn)不出來,但在實(shí)踐課程團(tuán)隊項目的幾千行代碼的項目中我確實(shí)感受到了他的意義。除非萬不得已,不要使用2、
37、程序的架構(gòu)一個程序可以從邏輯層抽象出不同的模塊,不同的模塊實(shí)現(xiàn)著不同的功能。因此,如果把屬于不同模塊的函數(shù)放到合適的不同的文件中。這可以降低不同模塊與函數(shù)的耦合度,將項目不同的模塊進(jìn)行 的編寫與測試,也方便功能的修改與添加。因此,程序的架構(gòu)是至關(guān)重要的。3、代碼規(guī)范注釋是極為重要的,無論在那個階段注釋都很有用用枚舉來代表信息類型或者狀態(tài),既會大大提高程序的開讀性,也可以用于 switch-case項目代碼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();語句中多人開發(fā)需要一個統(tǒng)一的代碼風(fēng)格,如均用駝峰命名法,函數(shù)作用是賦值就起 set , 是拿值就起 getxx。如果有了一個相對統(tǒng)一的代碼風(fēng)格,這會在和代碼階段起著一個非常重要的幫助。4、明確需求需求要盡可能的明確、清晰,初次做項目總是想著馬上上手去寫一些代碼或者拉出一些布局然而心里只有一個模糊的預(yù)期。以至于在不重要的細(xì)節(jié)處糾纏許久,且寫出的界面不符合最后的期望需要重寫,耽誤了進(jìn)度,而且沒有清晰的需求則讓人遇到比較麻煩的問題時容易放棄造成工
40、程質(zhì)量的下降。因此,明確需求對項目是十分的重要的,而且要要在動手寫代碼之前就已經(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 好友賬號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;/的賬戶名的賬號QPushButton *display_cls;/清屏按鈕QFile *record; /Record talkrecord;bool status_on=false;/是否打開QString id;/賬號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("開始");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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 特色餐廳廚師聘用及藝術(shù)創(chuàng)作合同模板
- 北京鐵路局新入職本科生培養(yǎng)計劃書
- 郴州保安綜合服務(wù)合同-綜合安保服務(wù)協(xié)議
- 礦產(chǎn)資源并購項目合同書
- 老人與海英語課件
- 汽車事故交警處理流程
- 消防安全重點(diǎn)單位監(jiān)管
- 下學(xué)期安全工作計劃
- 安全隱患排除方案
- 美術(shù)介紹自己課件
- 中國上海市酒店行業(yè)市場調(diào)查研究及投資前景預(yù)測報告
- 2025年巡檢機(jī)器人市場環(huán)境分析
- 教學(xué)設(shè)計培訓(xùn)課件
- 2025春季學(xué)期國開電大本科《管理英語4》一平臺機(jī)考真題及答案(第四套)
- DAISY SKY雛菊的天空:國貨眼油第一品牌
- (2025)《公共基礎(chǔ)知識》試真題庫與答案
- 2025盤錦市雙臺子區(qū)輔警考試試卷真題
- DB13T 2770-2018 焊接熔深檢測方法
- 關(guān)于衛(wèi)生院“十五五”發(fā)展規(guī)劃(完整本)
- 夫妻存款贈與協(xié)議書
- 2025海南中考:歷史必考知識點(diǎn)
評論
0/150
提交評論