Skip to content

Commit

Permalink
Update README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
ruokaic authored Oct 18, 2021
1 parent 73e95c8 commit 9c41746
Showing 1 changed file with 24 additions and 3 deletions.
27 changes: 24 additions & 3 deletions Mychat/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,24 @@
# Qt-project
一些Q练手的项目,主要为了熟悉Qt,同时巩固一下C++
项目包括:计算器、打点计时器、打地鼠、学生管理系统、聊天工具
# Mychat
我参考了CS模型,但是我想实现一个端到端的聊天工具,而不是一个客户端一个服务器,所以我把客户端和服务器结合到一起,每一端都可以主动请求连接,也可以监听连接请求。
### 如何实现发送接收 文本和文件
最主要的问题就是接收时怎么判断是文本还是文件,如果是文本,我直接显示,如果是文件我就需要保存。
**两种方案**
第一种比较取巧的办法是发送文件时用字符串作为头部,因为文本也是字符串,这样就可以兼顾文本和文件的判断,所以我就用一个字符串作为文件头,用符号#把它分成3段,第一段是标志,用来判断是文件还是文本,第二段是文件名,第三段是文件大小。当收到数据时,首先用Qstring.section以符号作为分隔符,判断到第一段是文本还是文件,如果是文本,就直接显示在文本浏览框里面;这样做的坏处就是会有粘包的问题,就算分开发送,TCP也会把头部和文件合并在一起发送,字符串头部大小不是固定的,很难确定头部和文件体边界,比较好的处理方法就是先发送文件头,延时发送文件本体;
另一种方式就是用结构体做为头部,类似协议,这样头部大小固定的,就不用担心黏包,缺点也明显,为了判断接收文本还是文件的时候兼容,发送文本的时候也要加头部;
综合考虑还是决定采用第一种,因为聊天大多数是发文本。
### 如何实现登录注册
首先我的用户信息是存在txt文件里的,每行对应一个用户信息,由用户名和密码构成的字符串,中间用空格分隔。当我点击登录时,先读取txt文件,把用户信息一行行存入Qstringlist里,每个元素对应一个用户信息,然后循环把一个个元素通过空格拆分(split)成用户名和密码与输入栏的用户和密码匹配,其他就是一些逻辑判断了,比如txt打开失败,提示先注册;先判断用户名,对上了再匹配密码,否则就弹出各种提示;
### 实现无边框窗口
因为Qt的窗口默认用系统自带边框的标题栏,又有字又有图标,而且四周边框颜色独立于窗口的背景颜色,视觉上不是很美观,我想实现的效果是去掉标题栏的文字图标,同时让边框与窗口颜色统一。
主要思路:让窗口隐藏,在窗口里面放一个widget充当原来的窗口,我们就可以在widget上设计自己的窗口外观
**具体做法**
用widget的setwindowflag,有个宏叫frameless就是把原本窗口边框隐藏;
用setAttribute有个宏可以把窗口透明;
经过这两步原本的窗口就隐藏了
这样导致的结果是窗口不能拖拽,窗口控制按钮也没了,而且没有边框,窗口没有了边界!
首先用ShadowEffect给widget增加阴影效果,这样窗口就有了边界,再通过自定义控件充当标题栏,增加窗口控制按钮,实现拖拽功能,同时背景颜色设置成透明,这样整个窗口背景颜色就统一了。

### 需要注意的点
服务器断开连接,客户端可以收到disconnect信号;但客户端主动断开服务器不会收到disconnect,需要通过SocketError来检测到客户端断开连接的错误,


0 comments on commit 9c41746

Please sign in to comment.