事件
事件与信号的关系??
点击按钮,也会进入到事件循环,处理槽函数
事件对操作系统而言
事件大部分都是由硬件触发;事件产生,操作系统是知道的
鼠标移动:
事件在qt中是由多态去实现的!!!
多态的条件:
- 继承,一个父类多个子类
- 父类中有虚函数,子类重写虚函数()
- 用父类的指针或者是引用去操作子类对象,调用虚函数时会触发多态
结论:
是所有事件类的父类
QWidget是所有控件类的父类
==》所有与用户交流互的控件类都是继承于QWidget
控件我们要去操作,必然会有事件发生,有事件发生就会有事件对象产生;控件就需要去执行事件处理函数。
总结:当用户去操作某一个控件的时候的,就会产生对应的事件,以及事件对象,控件的对象就会去执行对应的事件处理函数!如果子类中没有去重写对应事件的虚函数的,会执行父类原本的事件处理函数;如果控件子类重写了对应的事件处理函数,就执行子类自己的!
事件的产生是随机的,什么时候操作什么时候产生!
参数是 父类类型的指针
子类事件对象的地址 传给 QEvent * 调用控件对应的事件处理函数,实现多态
注意: event事件一般我们不需要重写,因为他内部实现的很完善!
事件产生—》event做事件分发(根据事件类型)--》执行对应的事件处理函数(有重写走重写,没重写走父类)—》发送对应的信号-》关联对应的槽函数做业务处理!!!
信号与事件的关系???
信号是在事件中被触发的!!!信号的底层就是事件;信号的本质就是事件!
鼠标事件
键盘事件
如果一个Widget里面的所有的控件现在都要屏蔽到键盘输入事件,每一个控件都要被继承,然后在子类中重写 event分发事件函数;-重写对应的事件处理函数,什么都不做!
绘图事件—查找什么时候会触发paintEvent事件
只要界面发生变化:放大还是缩小,都会触发这个绘图事件
只有按下左键才可以操作
- 网络编程—TCP
复习网络编程
- 使用Tcp搭建服务器流程:
- 创建套接字 socket 本质是文件,连通用户空间和内核空间
- 绑定Ip和port bind
- 创建监听队列 listen
- 等待连接 accept 之前三次握手已经完成,内核帮你已经完成了
- 收发消息,进行通信
- 关闭连接
- 使用Tcp搭建客户端的流程:
- 创建套接字 socket
- 连接 connect
- 通信
- 关闭连接
-
- 使用QT搭建客户端和服务端
Network模块
QTcpServer----- 创建监听套接字,程序运行起来的时候就已经存在了
QTcpSocket ------创建连接套接字, 客户端有多少个,连接套接字就有多少个
分析:QT服务器端如何搭建呢?
- 创建 QTcpServer对象
- 绑定Ip和port 并监听 QTcpServer::listen
- 建立连接: QTcpServer 就有会有个newConnection信号,槽函数里面就要接收当前连接的这客户端的QTcpSocket对象的地址
服务端收发: 服务端发送 点击按钮,槽里面write
服务器接收呢?QTcpSocket 会有一个信号产生—readyRead(缓存区有新数据进来就会产生这个信号)
槽里面 readData();
- 关闭连接
分析:QT客户端端如何搭建呢?
- 创建QTcpSocket对象
- 连接 connected()
- 通信
- 关闭连接
- 使用Qt做客户端 Linux做服务器
Linux的服务器:
传输文件信息
百度网盘:
下载:向服务器发起请求:: 文件名
服务器解析请求,然后传输文件信息给客户端
上传
通信协议的设计:
- 客户端发送请求: pic#文件名
服务器接收: 解析 pic 文件名 -à获取文件大小===》
# 替换成\0
然后在循环发送图片的数据到缓存区 send 1024
- 服务器如何发数据给客户端:
反馈第一部分数据给客户端:pic_ack#图片大小
第二部分是文件的详细数据
- 客户端如何接收: readyRead---》readData
<1>.先接收 服务器反馈的第一部分数据
<2>.只要接收图片信息就可以了
何时接收图片信息结束:
判断接收到的数据的大小和图片的大小是否一样,如果一样,接收完毕,在界面上要展示图片信息
Read 或是readAll
线程
进程中有线程,同步去执行多任务。线程开销比较小
使用线程:
创建线程
执行线程的处理函数 ---回调函数
线程退出
在QT中使用线程
- 引入QThread线程类---run—执行线程对应的业务
- 继承于QThread类写一个线程类
- 重写run线程执行函数
- 创建线程类的对象
- 启动线程 start()--》自动的调用run函数
- 线程退出 quit
- 线程回收 wait
项目打包步骤:
- 将工程的运行模式由debug改成release 发布版本
- 构建目录记得取消
- 运行一下,保证程序是没有报错或者异常的
注意:在整个程序中特别是线程中不要出现空循环,尽量增加一个qdebug的输出
所有的数据成员变量记得在构造中初始化
- 找到工程中 release文件夹中的exe 拷贝到一个bin文件夹中
- 将工程中有引入过的图片资源、数据库相关的等都拷贝到 bin文件夹中
- 切换到bin目录下
- 输入 windeployqt exe的名称
- 回车
- 打包完成,点击 exe肯是否可以正常运行