Qt程序的发布
所谓Qt程序的发布就是将设计好的Qt程序做成一个软件发布出去,Qt中有一个工具叫windeployqt专门用于发布windows qt程序。
将Qt工程设置为release版本并编译
打开Qt安装目录的命令行
在命令行执行以下命令
cd bin
windeployqt.exe 要发布的qt程序路径
windeployqt.exe
会将Qt程序运行所需要的所有库文件和其他文件拷贝到Qt程序所在的目录,完成之后直接点击exe为文件即可运行Qt程序。
事件处理
事件属于Qt的基础通信机制,信号和槽也是通过事件机制来实现的,作用是用于实现Qt对象的通信和对各种动作的响应。
产生事件
既可以通过某个预定义类的对象产生,也可以通过代码触发。
事件的定义
Qt中使用QEvent类来表示Qt中的事件,是所有事件的基类,常见的预定义事件如下:
QTimerEvent -------- QObject类定时器超时时间
QKeyEvent ---------- 按键事件
QMouseEvent -------- 鼠标事件
QMoveEvent --------- 窗口移动事件
QResizeEvent ------- 窗口大小改变事件
QWheelEvent -------- 鼠标滚轮事件
QPaintEvent -------- 绘图事件
.......
事件的处理
以鼠标点击事件和鼠标移动事件为例
在对象对应的类中重写特定事件的处理函数 --------- 子类继承
在对象对应的类中重写所有事件的处理函数 --------- 子类继承
virtual bool QObject::event(QEvent *evt);
练习:
在事件处理的两层加上鼠标移动事件的处理
事件处理函数 ------ mouseMoveEvent
事件类型 ---------- QEvent::MouseMove
程序中时间循环QApplication类中捕获事件的总接口(notify)
重定义方法:继承QApplication类,重写notify函数
事件过滤器
事件过滤器可以对指定的而时间进行过滤(特殊处理),处理完成之后可以选择继续交给下一层,也可以到此处理结束。
事件过滤器安装在某个对象上,处于notify和event之间。
如何实现过滤器:
1.实现一个观察者类,必须是QObject的子类
2.重写观察者类的过滤器处理函数 --------- eventFilter
3.将观察者对象安装到某个对象上 --------- xxx.installEventFilter
注意:实际应用中事件处理的四层不会对其全部重写,而是根据实际情况选择合适位置重写事件处理的方法。
事件的发送
Qt除了预定义的类类型对象能够发送预定义事件以外,也可以手动通过代码发送事件,手动通过代码发送的函数定义在QCoreApplication类中。
//函数一样参数不同
[static] void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority = Qt::NormalEventPriority);
[static] bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event);
//参数是给那个对象发送什么事件
//使用方法
1.创建事件
QEvent *e = new QEvent(...);//也可以继承自定义
2.发送事件
QCoreApplication::postEvent(发送独享的地址,e);
QCoreApplication::sendEvent(发送独享的地址,e);
//sendEvent直接发送,postEvent先进入事件处理队列
练习:
实现按键的移动,不能移动出窗口的范围
width() -------- 获取宽度
height() ------- 获取高度
Qt中的网络开发
socket通信
Qt中也提供TCP/UDP的套接字通信,使用时需要包含网络模块和对应的头文件
1.在项目文件中添加(.pro)
QT += network
2.在代码中添加
#include <QtNetwork>
套接字分类
TCP流式套接字 ------------ QTcpSocket
UDP数据包套接字 ---------- QUdpSocket
应用层网络相关类
QNetworkRequest QNetworkReplay QNetworkAccessManager
TCP网络通信的实现
服务器
1.创建一个TCP服务器对象
mServer = new QTcpServer;
2.调用QTcpServer对象的接口进行监听
mServer->listen(QHostAddress::Any/*IP地址*/,端口号);
//当客户端连接上来时,会触发信号(newConnection),连接该信号和槽
3.在槽函数中获取和客户端通信的套接字
mSocket = mServer->nextPendingConnection();
4.和客户端通信
发送:
通过QTcpSocket对象的write成员函数发送数据
接收:
收到数据会触发信号(readyRead),在连接的槽函数中调用QTcpSocket对象的read/readAll接收
客户端
1.创建一个QTcpSocket对象
mSocket = new QTcpSocket;
2.通过QTcpSocket对象成员函数connectToHost连接服务器
mSocket->connectToHost(ip,端口号);
//连接成功触发connected信号
3.和服务器通信
发送:
通过QTcpSocket对象的write成员函数发送数据
接收:
收到数据会触发信号(readyRead),在连接的槽函数中调用QTcpSocket对象的read/readAll接收
UDP通信的实现
Qt中使用QUdpSocket实现UDP通信
服务器
1.创建QUdpSocket对象
mSocket = new QUdpSocket;
2.绑定通信地址
msocket->bind(ip,端口号);
3.通信(先接收)
收到数据会触发信号(readyRead),通过QUdpSocket对象的readDatagram函数来接收
//readDatagram(首地址,长度,发送方ip,发送方端口号);
客户端
1.创建QUdpSocket对象
mSocket = new QUdpSocket;
2.通信(先发送)
writeDatagram(数据,接收方ip,接收方端口号);
作业:
1.使用鼠标滚轮放大和缩小按键
鼠标滚轮事件 ------------- QEvent::wheel
鼠标滚轮的事件处理函数 ---------- wheelEvent
//滚动的方向和大小
event->delta();
//返回值表示滚动的距离
//大于0表示往上滚,小于0往下滚
2.使用Qt的客户端和Linux的服务器实现UDP通信