-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
24 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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来检测到客户端断开连接的错误, | ||
|
||
|