




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 福建对外经济贸易职业技术学院《药物生物技术》2023-2024学年第二学期期末试卷
- 《大战中的插曲》教学设计 2023-2024学年统编版高中语文选择性必修上册
- 海南热带海洋学院《男装设计》2023-2024学年第二学期期末试卷
- 山东政法学院《数字集成电路设计》2023-2024学年第二学期期末试卷
- 太原幼儿师范高等专科学校《高级管理统计》2023-2024学年第二学期期末试卷
- 皖江工学院《专业技能训练化学教学技能与训练》2023-2024学年第二学期期末试卷
- 郑州体育职业学院《室内空间设计公共》2023-2024学年第二学期期末试卷
- 吉林体育学院《生物工程专业分析》2023-2024学年第二学期期末试卷
- 河南2025年河南职业技术学院招聘30人笔试历年参考题库附带答案详解
- 免烧砖销售合同范本
- 人教版(2025版)七年级下册英语UNIT 1 Animal Friends 单元整体教学设计(6个课时)
- 项目管理知识手册指南
- 全屋定制家居建议书可行性研究报告备案
- 2025年常熟市招聘进村人员历年高频重点提升(共500题)附带答案详解
- (主城一诊)重庆市2025年高2025届高三学业质量调研抽测 (第一次)物理试卷(含答案)
- 2025年中国电信集团有限公司招聘笔试参考题库含答案解析
- DB50T 393-2011 城市三维建模技术规范
- 《肺癌围手术期护理》课件
- 《糖尿病足护理查房》课件
- 山东省临沂市地图矢量课件模板()
- 2024复工复产安全培训
评论
0/150
提交评论