DAY6--Qt程序的发布,事件处理和Qt网络socket通信

272 阅读5分钟

Qt程序的发布

所谓Qt程序的发布就是将设计好的Qt程序做成一个软件发布出去,Qt中有一个工具叫windeployqt专门用于发布windows qt程序。

将Qt工程设置为release版本并编译

image-20220731145259291

打开Qt安装目录的命令行

image-20220731145304714

image-20220731145310516

在命令行执行以下命令

cd bin
windeployqt.exe 要发布的qt程序路径

image-20220731145316253

windeployqt.exe

会将Qt程序运行所需要的所有库文件和其他文件拷贝到Qt程序所在的目录,完成之后直接点击exe为文件即可运行Qt程序。

事件处理

事件属于Qt的基础通信机制,信号和槽也是通过事件机制来实现的,作用是用于实现Qt对象的通信和对各种动作的响应。

产生事件

既可以通过某个预定义类的对象产生,也可以通过代码触发。

事件的定义

Qt中使用QEvent类来表示Qt中的事件,是所有事件的基类,常见的预定义事件如下:

QTimerEvent -------- QObject类定时器超时时间
QKeyEvent ---------- 按键事件
QMouseEvent -------- 鼠标事件
QMoveEvent --------- 窗口移动事件
QResizeEvent ------- 窗口大小改变事件
QWheelEvent -------- 鼠标滚轮事件
QPaintEvent -------- 绘图事件
.......

事件的处理

以鼠标点击事件和鼠标移动事件为例

在对象对应的类中重写特定事件的处理函数 --------- 子类继承

image-20220731145330263

在对象对应的类中重写所有事件的处理函数 --------- 子类继承

virtual bool QObject::event(QEvent *evt);

image-20220731145336216

练习:

在事件处理的两层加上鼠标移动事件的处理

事件处理函数 ------ mouseMoveEvent
事件类型 ---------- QEvent::MouseMove

程序中时间循环QApplication类中捕获事件的总接口(notify)

重定义方法:继承QApplication类,重写notify函数

image-20220731145343045

image-20220731145349882

事件过滤器

事件过滤器可以对指定的而时间进行过滤(特殊处理),处理完成之后可以选择继续交给下一层,也可以到此处理结束。

事件过滤器安装在某个对象上,处于notify和event之间。

如何实现过滤器:

1.实现一个观察者类,必须是QObject的子类
2.重写观察者类的过滤器处理函数 --------- eventFilter
3.将观察者对象安装到某个对象上 --------- xxx.installEventFilter

image-20220731145357197

image-20220731145402214

image-20220731145406130

注意:实际应用中事件处理的四层不会对其全部重写,而是根据实际情况选择合适位置重写事件处理的方法。


事件的发送

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先进入事件处理队列    

image-20220731145414343

练习:

实现按键的移动,不能移动出窗口的范围

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通信