




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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需求分析一、需求概述:現在是一個信息 ,人們傳遞信息的方式已經從過去的書信轉變為使用 ,電腦等電子設備通過 進行信息交流。因此,一個優秀的聊天軟件對于每個人來說必不
2、可少。然而,現在主流的即使通訊軟件如 , 等在軟件包含內容上充斥了大量的 成份與大量無用信息,這會降低用戶在聊天中的使用體驗。因此一個能夠實現私聊,群聊的輕量級聊天軟件對廣大用戶來說是必不可少的。本軟件是一款面向個人的基于服務器的 IM(Instant Messenger)軟件,提供基于廣域網的客戶端進行文字傳輸、實時語音、文件傳輸。軟件系統采用 Client/Server 架構。二、系統概述1.運行環境:服務器:Windows Server 2008 R2 企業版 64 位數據庫:MySQL基礎平臺:Qt 5.90 2.系統結構:系統包括兩種終端:服務器端、客戶端服務器承擔客戶端驗證,獲取好
3、友列表、聊天信息與文件的中轉。客戶端和服務器之間進行點對點 TCP 通信,實現賬號,賬號登陸,私聊和群聊功能3.關鍵通訊模式說明: 客戶端與客戶端私聊客戶端 1服務器客戶端 2信息客戶端與客戶端群聊群組客戶端 1服務器客戶端 2客戶端 3三、系統功能組成用戶界面 客戶端功能客戶端與服務器 TCP 傳輸服務器數據庫搭建1. 用戶界面1.1 登陸界面界面要求優先度賬號輸入高記住高總體界面要求優先度窗口大小適應分辨率高皮膚色彩更換中調節低信息自動登錄中在上方嵌入 GIF 動圖高在上方嵌入 OpenGL 動畫低1.2界面1.3.人界面1.4 聊天界面界面要求優先度人,群界面實現自由切換高人分組顯示高窗
4、口到邊緣時自動浮現與隱藏中更換頭像低界面要求優先度用圓點顯示高實現用戶名,賬號的輸入高個人信息輸入中1.5 查找與添加界面界面要求優先度添加好友高添加群高創建群高界面要求優先度并顯示文字消息高并顯示圖片消息高并語音消息中實現文件拖拽功能低1.6 設置界面1.7 托盤欄2. 客戶端功能2. 1 用戶登錄基本流程:用戶輸入用戶名、,然后點擊登錄按鈕。登陸后顯示主界面分支流程:1. 如果用戶沒有輸入用戶名,程序將顯示一條錯誤消息,指出錯誤并提示用戶輸入用戶名2. 如果用戶輸入的用戶名未被,程序提示用戶輸入的用戶名不3. 如果用戶輸入的用戶名錯誤,程序將顯示一條錯誤消息,指出錯誤并提示用戶輸入正確的用
5、戶名和2.2基本流程:登陸界面有的,用戶點擊后程序自動打卡界面。用戶輸入用戶名、賬號、,然后點擊按鈕。后自動關閉界面,返回到登陸界面分支流程:1. 如果賬號已被,程序將顯示一條錯誤消息,提示用戶更改賬號2. 如果賬號格式不合法程序將顯示一條錯誤信息,提示用戶更改賬號界面要求優先度托盤欄菜單高軟件隱藏至托盤欄高選擇狀態(離開,忙碌,)中可從托盤欄高界面要求優先度基本設置(開啟,關閉聲音)中基本設置(離開與忙碌時自動回復)低2.3 添加好友基本流程:用戶點擊主界面中的添加界面后,將彈出添加界面。輸入要添加的好友的賬戶名,和添加理由。點擊添加按鈕后。程序將向所要添加的好友發出一條申請驗證彈窗,好友同
6、意后即添加好友 。分支流程:如果好友拒絕了添加好友申請,那么即為添加好友失敗。添加好友的用戶會顯示好友申請被拒絕的彈窗。2.4 添加群基本流程:用戶點擊主界面中的添加界面后,將彈出添加界面。輸入要添加的群的群賬號。點擊添加按鈕后。程序將群管理員發出一條申請驗證彈窗,管理員同意后即添加好友。分支流程:如果群管理員拒絕了添加群申請,那么即為添加群失敗。添加群的用戶會顯示群申請被拒絕的彈窗。2.5 創建群基本流程:用戶點擊主界面中的添加界面后,將彈出添加界面。用戶輸入群名、群賬號、,然后點擊創建群按鈕。創建后自動關閉添加界面,返回到主界面。分支流程:1. 如果群賬號已被,程序將顯示一條錯誤消息,提示
7、用戶更改賬號2. 如果群賬號格式不合法程序將顯示一條錯誤信息,提示用戶更改賬號2.6 聊天 基本流程:用戶輸入聊天文字內容,點擊,該消息即給對方。用戶點擊文件按鈕,將彈出選擇文件窗口,用戶選擇所要的文件后,該文件即給對方用戶長按語言按鈕,程序將開始錄制音頻。松開按鈕后將把已經錄好的消息給對方用戶點擊清屏按鈕,聊天窗口歷史被清除。分支流程:1. 如果沒有輸入信息,直接點擊。系統會提示錯誤,請求輸入信息2. 如果用戶或者收到的文件是圖片,則該圖片將直接顯示在聊天窗口中2. 若用戶離線,則該消息,或文件儲存到服務器端的數據庫,等用戶上線自動將數據庫中的內容給用戶。3. 處于托盤狀態時,接收消息會有響
8、鈴提醒3.客戶端與服務器 TCP 傳輸3.1 經服務器中轉的文字傳輸3.2 經服務器中轉的文件傳輸3.3 離線文件的保存與再次4. 服務器數據庫搭建4.1 實現個人賬號信息的增刪改查4.2 實現群賬號信息的增刪改查4.3 離線消息的增刪查概要設計一、結構圖及說明模塊名模塊說明數據庫存放用戶數據,并提供,修改等接口服務器消息與文件處理將從客戶端接收到了消息進行,并執行該消息所要進行的操作服務器端 TCP 傳輸與客戶端進行直接的收發消息和文件操作客戶端 TCP 傳輸與服務器端進行直接的收發消息和文件操作客戶端消息和文件處理將從服務器端接收到了消息進行,并執行該消息所要進行的操作用戶主界面與用戶交互
9、,展示好友列表,群列表,頭像等信息消息提示界面與用戶交互,展示添加好友請求等消息聊天界面與用戶交互,可進行字,發語音,發圖片,件等操作登陸界面與用戶交互,可進行登陸操作界面與用戶交互,可進行操作添加好友或群界面與用戶交互,可進行添加好友或群操作二、類圖及說明Database 類成員說明:QSqlDatabase db保存數據庫連接信息bool createConnection() 創建數據庫bool createUserTable()創建總用戶表,來存放所有的賬號信息bool createGroupTable()創建總群表,用來存放群名信息bool createFriendTable(QStr
10、ing accountNumber)創建好友表,用來存放某個好友的所有好友信息bool createGroupMemberTable(QString groupNumber) 創建群成員表,用來存放某個群的所有群成員信息bool createMessageTable(QString accountNumber)創建離線消息表,用來暫存某個好友的離線信息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 用來創建 TCP QList<User *> userList已連接用戶表,存放著所有用戶的信息Databas
14、e database數據庫類,對數據庫進行操作void analyseMessage(QString information,int i)對接到的信息類型做出,據此執行不同的操作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)把文件發給好友void readFile()文件void sendFileDirect(QString accountNumber)直接文件void addTolist()將新連接用戶加到 list 里void socketDisconnected() 用戶斷開連接后的處理void startSendFil
16、e(QString fileName)開始文件的信號user 類成員說明: QString username 用戶名QString accountNumber賬號QTcpSocket *tcpsocket此用戶所對應的 socketClient 類成員說明:QString username用戶昵稱QString accountNumber用戶賬號 QString password 用戶QString friendList 用戶好友信息QString groupList 用戶群信息QTcpSocket *tcpSocket儲存與服務器連接的 socket 信息void newConnect()建
17、立 TCP 連接void displayError(QAbstractSocket:SocketError)顯示 TCP錯誤void getOldMessage()獲取離線消息好離線文件void login(QString User,QString Password)發出登陸申請void registerAccount(QString accountNumber,QString Password,QString userName)賬戶void sendMessage(QString infomation)消息void readMessage()消息void analyseMessage(QSt
18、ring information)對從服務器接收到的消息進行處理void sendMessageToFriend(QString information,QString accountNumber)向好友發消息void sendMessageToGroup(QString information,QString groupNumber)向消息void sendFileToFriend(QString fileName,QString accountNumber)向好友文件void sendFileToSever(QString fileName,int fileType)向服務器文件 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) 創建群void addGroupMember(QString
20、 groupNumber)添加群login 類成員說明:float rat比率int startX,startY動畫所需坐標void loginSuccess(QString name)接受 client 發來的登陸消息,并打開主界面窗口void on_pushButton_clicked()點擊登錄并通過 client 向服務器發消息void on_pushButtion_clicked()點擊彈出窗口 void initialwindow() 初始化窗口void mousePressEvent(QMouseEvent*event) void mouseMouveEvent(QMouseEv
21、ent *event) void mouseReleaseEvent(QMouseEvent *evet) 以上三組函數實現鼠標拖拽窗口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 托盤欄圖標void setfriendlist(QString friendlist,QString myname)設置好友列表和昵稱void setgrouplist(QString grouplist,QString myname)設置群列表和昵稱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()遍歷好友聊天框并選擇狀態為 on 的打開void discuss()遍歷群聊天框并選擇狀態為 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()創建群按鈕void on_search_btn_g_clicked()添加群按鈕chatwindow 類成員說明QPushButton* btn_fpi 頭像按鈕QLab
25、el *nam_fpi 好友昵稱QLabel*head好友頭像QPushButton*btn_del 刪除按鈕QString currentpath 當前文件目錄 QString my_name的昵稱QString my_id的賬號QPushButton*display_cls 清屏按鈕QFile *record文件Record talkrecord 語音對象bool status_on狀態void receive_message(QString message)接受消息void receive_file(QString filename)接收文件void oppstatus() 窗口置于打開
26、狀態void setrecord()消息void writerecord()保存void deletefriend()刪除好友void setid(QString id)傳入好友賬號alert 類成員說明QString friendAccountNumber來自好友的賬號void mySetText(QString text)設置要顯示的內容void mysetvisual(bool)按鈕不可見void initialwindow()窗口初始化disscusswindow 類成員說明QPushButton* btn_gpi頭像按鈕QLabel *nam_gpi群名稱QString curren
27、tpath 當前文件目錄 QString my_name的昵稱QString my_id的賬號QPushButton*display_cls 清屏按鈕QFile *record文件bool status_on 狀態void receive_message(QString message,QString name)接受消息void setmemberdisplay(QString)展示群友void oppstatus()窗口置于打開狀態void setid(QString id)傳入賬號record 類成員說明QString path文件路徑void startRecord()開始void st
28、opRecord()結束void playRecord()關鍵數據結構enum MessageInfo/ /客戶端發向服務器的消息類型LOGIN,/登陸REGISTER,/MESSAGE_TO_FRIEND,/發向好友的消息MESSAGE_TO_GROUP,/發向群的消息FILE_TO_FRIEND,/發向好友的文件FILE_TO_SERVER,/發向服務器的文件FILE_START_SEND,/客戶端傳來文件FILE_TO_GROUP,/發向群的文件GET_FRIEND_LIST,/獲取好友列表GET_GROUP_LIST,/獲取群列表GET_OLD_MESSAGE,/獲取離線消息ADD_F
29、RIEND,/添加好友ADD_FRIEND_DIRECT,/直接添加好友REJECT_ADD_FRIEND,/拒絕好友申請ADD_GROUP,/添加群CREAT_GROUP,/創建群DELETE_FRIEND,/刪除好友DELETE_GROUP,/刪除群CHANGE_LOGIN_STATUE,/更改登錄狀態CHANGE_USERNAME,/更改用戶名QUIT,/推出/ /服務器發向客戶端的消息類型LOGIN_SUCCESS ,/ 登錄LOGIN_FAIL,/ 登錄失敗HAVE_LOGINED,/ 已經登錄REGISTER_SUCCESS,/ REGISTER_FAIL,/失敗CREATE_GR
30、OUP_SUCCESS,/創建群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,/好友申請添加;總用戶表 User&q
31、uot;create table User (accountNumber varchar(20) primary key, userName varchar(20),passWord varchar(20)"一個賬戶的賬號,昵稱,為總用戶表的一條創建總群表 Groups"create table Groups (accountNumber varchar(20) primary key)"一個群的賬號為總群表的一條創建好友表 表名為賬號名QString("create table %1 (accountNumber varchar(20) primary
32、 key)").arg(accountNumber)某用戶的一個好友的賬號為好友表的一條創建群成員表 表名為群賬號名QString("createtable%1message(messageTextvarchar(400),messageTime varchar(40)").arg(accountNumber)某用群的一個群成員的賬號為群成員表的一條創建離線消息表 表名QString("create table %1message (messageText varchar(400),""messageTime varchar(40)&
33、quot;).arg(accountNumber)功能測試登陸界面,登陸功能正常。分辨率自適應功能正常界面,功能正常主窗口添加好友或群。 添加好友功能正常如果對方離線,登陸后可以收到好友申請消息添加群功能正常創建群功能正常聊天功能正常,可以字,發圖片, 可以錄語音,發語音,放語音可以件可以清屏,保存,重新打開程序后顯示上次的可以發離線消息,離線文件,圖片,語音實驗小結一、出現的問題1. 多客戶端之間的信息傳遞如果只是如同書上例子一樣單純的做個沒有賬戶概念,僅僅在兩個特定客戶端和服務器之間的消息收發的聊天軟件,那么實現起來會非常的容易。但是如果面向的 n 個客戶端,需要有賬戶的概念,那么就需要重
34、新設計消息的收發過程。所以,我們通過一個設計一個UserList 容器來存放不同的客戶端連接,定義了消息類型的枚舉,重構了 sendMessage 與readMesage 的實現方式從而解決了多客戶端之間的信息傳遞問題2. 服務器與客戶端文件傳輸文件如何在多個客戶端與服務器之間傳輸是一個問題,因為文件傳輸有別于消息傳輸, 不能單純把兩個模塊組合其來。為了解決這個問題,我們設計了服務器與客戶端之間的文件傳輸過程。先通過幾輪的消息使雙方做好收文件和件的準備,并開始文件。文件接受完畢之后再通過消息結束收件的狀態。3. 離線消息與文件的實現TCP 下消息的傳遞的基礎是雙方都是 狀態。但在實際生活中消息
35、的接收者可能不是 狀態。這就需要服務器儲存這些離線消息到數據庫中,儲存文件到服務器端,待用戶登錄后再將從數據中把離線消息和離線文件提取并 給用戶。因此,我們精心設計一種服務器與客戶端的握手方式,使離線消息和文件能夠讓客戶端順利的接受,處理,并做出可能的應答。4. 數據庫的語句的執行在編寫這個數據庫時,由于是第一次寫 SQL,所以犯了很多錯誤。數據庫建表的時, 表的名字不能和數據庫的關鍵字(如 group)重復,否則就會出現異常。在拼湊數據庫要執行的語句時, 的字符串數據要用單引號括起來,因為拼湊進去的只是字符串里頭的文字內容。5. 中文亂碼問題我們在編寫客戶端界面時,出現了顯示中文字體亂碼的問
36、題。雖然這看起來是一個小問題,但它確實困擾了我們很久。最終的解決辦法是將全部代碼 進記事本,另存 UTF-8 后再將其打開代碼再 會原 ,即進行了一次轉碼。然后在源程序里設置字符串格式同為 UTF-8,即添加語句 QTextCodec *codec=QTextCodec:codecForName("UTF-8")。二、感悟體會1、全局變量全局變量要盡可能的少用,除非萬不得已。全局變量破壞了函數,類的封裝性能,降低了代碼的可移植性,也影響了程序的可讀性。這一點在幾百行的 或許體現不出來,但在實踐課程團隊項目的幾千行代碼的項目中我確實感受到了他的意義。除非萬不得已,不要使用2、
37、程序的架構一個程序可以從邏輯層抽象出不同的模塊,不同的模塊實現著不同的功能。因此,如果把屬于不同模塊的函數放到合適的不同的文件中。這可以降低不同模塊與函數的耦合度,將項目不同的模塊進行 的編寫與測試,也方便功能的修改與添加。因此,程序的架構是至關重要的。3、代碼規范注釋是極為重要的,無論在那個階段注釋都很有用用枚舉來代表信息類型或者狀態,既會大大提高程序的開讀性,也可以用于 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();語句中多人開發需要一個統一的代碼風格,如均用駝峰命名法,函數作用是賦值就起 set , 是拿值就起 getxx。如果有了一個相對統一的代碼風格,這會在和代碼階段起著一個非常重要的幫助。4、明確需求需求要盡可能的明確、清晰,初次做項目總是想著馬上上手去寫一些代碼或者拉出一些布局然而心里只有一個模糊的預期。以至于在不重要的細節處糾纏許久,且寫出的界面不符合最后的期望需要重寫,耽誤了進度,而且沒有清晰的需求則讓人遇到比較麻煩的問題時容易放棄造成工
40、程質量的下降。因此,明確需求對項目是十分的重要的,而且要要在動手寫代碼之前就已經明確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;/標題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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 家政功能室管理制度
- 弱電設備間管理制度
- 微機室衛生管理制度
- 心理康復室管理制度
- 接種點接種管理制度
- 操作間制度管理制度
- 收費及開支管理制度
- 政府財務章管理制度
- 教學培訓部管理制度
- 教師營養餐管理制度
- 托克遜縣寶源長石礦廠新疆托克遜縣桑樹園子南山銅礦3萬噸/年采礦項目環評報告
- 陜西省西安高中2025屆高二化學第二學期期末達標檢測試題含解析
- 2025年江西報業傳媒集團有限責任公司招聘筆試沖刺題(帶答案解析)
- (2025)《公共基礎知識》試真題庫與答案
- 江西省南昌市第一中學教育集團2023-2024學年八年級下學期數學期末試卷(含答案)
- 瓦斯抽采考試題庫及答案
- 網絡題庫財務會計知識競賽1000題(僅供自行學習使用)
- 關于衛生院“十五五”發展規劃(完整本)
- 地生中考模擬試題及答案
- 中醫調理高血壓課件
- 商業招商運營管理制度
評論
0/150
提交評論