Qt、事件的发送和接收以及自定义用户事件
1、Qt的事件机制
Qt程序是事件驱动的,程序的每个动作都是由幕后某个事件所触发;事件的发生和处理成为程序运行的主线,存在于程序整个生命周期。Qt事件的类型很多,常见的qt的事件如下:
- 键盘事件: 按键按下和松开.
- 鼠标事件: 鼠标移动,鼠标按键的按下和松开.
- 拖放事件: 用鼠标进行拖放.
- 滚轮事件: 鼠标滚轮滚动.
- 绘屏事件: 重绘屏幕的某些部分.
- 定时事件: 定时器到时.
- 焦点事件: 键盘焦点移动.
- 进入和离开事件: 鼠标移入widget之内,或是移出.
- 移动事件: widget的位置改变.
- 大小改变事件: widget的大小改变.
- 显示和隐藏事件: widget显示和隐藏.
- 窗口事件: 窗口是否为当前窗口.
除了系统预定义的事件,有时我们还需要自定义事件,用来完成某种动作,或者将某种动作发送到Qt的事件循环中,用于主界面的显示。
例如,在使用OpenCV、libhv这种第三方组件的时候,libhv通过网络接收数据的时候需要注册接收回调函数,在Qt中回调函数为静态函数,无法将接收到的数据在UI界面上显示。
解决办法就可以使用实现附带参数的自定义事件,将该事件发送到Qt的主事件循环中,这样在customEvent中就可以将收到的数据通过ui指针在界面控件上显示了。
2、自定义事件
Qt的事件所有的父类是:QEvent
Qt事件类型:QEvent::Type
其中,可供用户自定义使用的事件ID为1000~65535。
自定义事件方法也比较简单,继承QEvent并将自定义类型传入即可。
下面展示示例:
扫描二维码关注公众号,回复:
15265366 查看本文章
自定义类型头文件:
#ifndef CUSTOMEVENT_H
#define CUSTOMEVENT_H
#include <QEvent>
#include <QString>
// 注册自定义事件类型
#define CSTM_EVENT_ID1 static_cast<QEvent::Type>((QEvent::User + 1))
#define CSTM_EVENT_ID2 static_cast<QEvent::Type>((QEvent::User + 2))
class CustomEvent : public QEvent
{
public:
CustomEvent();
};
class CustomEvent2 : public QEvent
{
public:
CustomEvent2();
QString msg; /* 用于携带数据 */
};
#endif // CUSTOMEVENT_H
源文件:
#include "customevent.h"
CustomEvent::CustomEvent() : QEvent(CSTM_EVENT_ID1)
{
}
CustomEvent2::CustomEvent2() : QEvent(CSTM_EVENT_ID2)
{
}
3、事件的发送和处理
发送事件函数有两个:sendEvent、postEvent。
区别:
sendEvent函数是阻塞式的,所以支持栈空间和堆空间事件对象的发送(局部对象和new分配的对象)。
postEvent静态函数实现非阻塞发送,当事件发送后立即返回,事件将会发送到事件队列中等待处理。
注:new分配的事件对象被处理后,会由Qt内部自动销毁。
发送事件可以使用QApplication::sendEvent,也可以利用全局变量qApp->sendEvent。
示例代码如下,在主窗体中重新实现虚函数customEvent:
protected:
void customEvent(QEvent *event);
void Widget::customEvent(QEvent *event)
{
switch ((int)event->type())
{
case CSTM_EVENT_ID1:
{
CustomEvent* e = static_cast<CustomEvent*>(event);
qDebug() << "custom event 1";
break;
}
case CSTM_EVENT_ID2:
{
CustomEvent2* e = static_cast<CustomEvent2*>(event);
qDebug() << "custom event 2: " << e->msg;
break;
}
default:break;
}
}
void Widget::on_btnSendEvent1_clicked()
{
CustomEvent e;
qApp->sendEvent(this, &e);
}
void Widget::on_btnSendEvent2_clicked()
{
CustomEvent2 e;
e.msg = "send event 2 msg !";
qApp->sendEvent(this, &e);
}
void Widget::on_btnPostEvent1_clicked()
{
qApp->postEvent(this, new CustomEvent());
}
void Widget::on_btnPostEvent2_clicked()
{
CustomEvent2* e = new CustomEvent2();
e->msg = "post event 2 msg !";
qApp->postEvent(this, e);
}
ends…