C++跨平台开发——Linux下QT实现客户端聊天的六大细节

上图中,Write 是可以发出账号密码(点击登录按钮),read可以判断登录成功(聊天界面)还是失败(登录界面)

1、定义单例类

登录界面和聊天界面等界面都要实现读、写线程,因为功能基本一样,分别定义成单例类

网络连接之后的socket是最重要的——定义网络连接单例类,如下图

这样就可以在多个窗口同时使用(不能直接在窗口里面创建线程)

2、何时打开网络连接?

①按下登录按钮(构造函数中准备好所有数据——获取socket传到读、写线程——此时没有打通网络,直到create才打通)

②客户端运行的那一刻(所有窗口出现之前(如果网络不通进行提示,不用显示窗口)或者第一个窗口显示的时候,如下图)

3.1如何把数据传递给线程?

也就是填完账号密码,数据怎么传到线程里面去(或者说面向对象中一个类的数据怎么传给到另一个类)?

解决方法:使用set。

比如A类要传递数据给B类,那么要在B类中定义set方法,在A类中使用B类对象调用set方法实现数据传递。这里我们要在登录界面传递数据给写线程,要在写线程类中定义set方法,在登录类中定义写线程类对象即可实现(面向对象的get、set是重点)

3.2如何把数据用写线程write出去?

在登录界面需要使用读、写线程、通信协议结构体以及网络连接单例类。点击登录的时候,就可以打通网络连接,启动读、写线程(写线程发数据),写线程一启动就会调用线程执行函数就会把数据发送到服务器

4、聊天信息和用户信息使用的是不同的结构体,write中应该使用什么数据类型呢?

注意不能使用void*(无类型指针),长度不能确定(64位8字节),write的时候需要长度,第二个参数可以使用void*,但第三个参数sizeof(指针)只有8字节, 我们传递的数据肯定不止8字节,因此行不通。

解决方法:使用char类型的数组。

在给写线程类传递数据参数的时候带上数据长度,write的时候就有具体的长度了,就能发送给服务器了,服务器再反馈回来给读线程。

5、线程中怎么判断应该跳转到哪个界面?

服务器在返回的时候一定要告诉客户端什么业务,处理成功还是失败,附带哪些数据。这样客户端在读的时候可以读到业务结果,再根据业务类型跳转到对应的窗口。(也就是客户端为什么一定更要反馈头的原因)

6、头文件冲突

也就是登录界面包含读线程,读线程中又包含登录、聊天界面导致头文件互相包含

解决方法:使用自定义信号——emit。只负责发出这个信号,不需要清楚接收方是谁

读线程中读到数据,判断业务类型后即可发送信号。然后在登录界面connect,连接信号和槽,槽函数中去判断返回值(1则表示登录成功),这时候才决定跳转到什么窗口(如果是聊天窗口则要传递聊天对象用户名)。

总结:

1、Qt客户端编写思路

  • 三个单例——读、写单例、网络接口单例
  • 两个线程—―读写线程
  • 两个业务——登录聊天业务
  • 一个信号——传递参数

2、六个细节

  • 1、读写线程单例化——基本功能一致,读写分开,容易操作
  • 2、客户端打开网络连接时机——点击登录时或所有界面运行前
  • 3、界面输入数据怎么传输一一访问读写线程set相关函数
  • 4、不同结构体如何传输数据——void*传参必须再传一个长度;因为void *是无类型指针,无法通过sizeof获取长度(不太确定)﹔或者char字符数组传输,带结构体大小参数,用来获取传递过来的结构体数据
  • 5、如何进行界面跳转——通过返回的业务类型,如登录成功跳转聊天主界面(如果不涉及通信,可直接跳转,比如退出登录,返回等)
  • 6、头文件冲突——emit发送信号,传递参数

补充:

1、Linux的Qt编译出现:-1: error: cannot find -lGL问题的解决方法

①直接更新libgl1-mesa-dev

sudo apt-get install libgl1-mesa-dev

②在 /usr/lib/ 目录下为 OpenGL 链接库创建一个链接

sudo ln -s /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 /usr/lib/libGL.so

2、解决ubuntu下Qt中无法输入中文的问题

环境:ubuntu16.04 、Qt5.9.8

安装fcitx-frontend-qt5

sudo apt-get install fcitx-frontend-qt5

查看 fcitx-frontend-qt5的安装目录

ls -l /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so

拷贝到Qt的安装目录下(根据实际情况)

sudo cp /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so /opt/Qt5.9.8/5.9.8/gcc_64/plugins/platforminputcontexts/
sudo cp /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so /opt/Qt5.9.8/Tools/QtCreator/lib/Qt/plugins/platforminputcontexts/
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ze言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值