行业知识
【QT】事件分发器/事件过滤器/事件处理的介绍和使用
2026-11-15 01:17:43
来源:互联网转载
事件分发函数 event()
事件分发器:返回值 bool
如果返回时true,代表用户要处理事件,不再分发事件了。
- 事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。
- event()函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的事件处理(eventhandler)。
因此如上所述,event()函数主要用于事件的分发。所以,如果你希望在事件分发之前做一些操作,就可以重写这个event()函数了。
event事件
#include
- 用途:用于事件的分发
- 也可以用作拦截事件(不建议)
例如,我们希望在一个QWidget组件中监听 tab 键的按下,那么就可以继承QWidget,并重写它的event()函数,来达到这个目的
//事件分发器bool mylabel::event(QEvent *e){ if(e->type() == QEvent::KeyPress) { 静态类型转换 QKeyEvent *keyEvent = static_cast(e); if(keyEvent->key()==Qt::Key_Tab) { qDebug() //如果键盘按下,在event事件分发中做拦截操作 if(e-type() == QEvent::MouseButtonPress) { //静态类型转换 QMouseEvent *ev = static_castx()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY()); qDebug()installEventFilter(this).- 发送到obj的所有事件, 都会先发送到filterObject的eventFilter()方法,
- 即filterObject会过滤obj的事件, 这样就不用为了实现一个事件而要去继承, 再实现一个类, 完成如mouse event, key event等了, 只用在当前类中就可以通过事件过滤来完成.
在程序将事件分发到事件分发器前,可以利用过滤器拦截
1.给控件安装事件过滤器
2.重写eventFilter函数(obj,sv)
public: explicit Event(QWidget *parent = nullptr); ~Event(); //重写事件过滤器事件 bool eventFilter(QObject*obj,QEvent*e);
#include "event.h"#include "ui_event.h"#include #include #include Event::Event(QWidget *parent) : QWidget(parent), ui(new Ui::Event){ ui->setupUi(this); //步骤一安装事件过滤器 ui->label->installEventFilter(this); //步骤2L重写eventfilter事件} bool Event::eventFilter(QObject*obj,QEvent*e) { if(obj == ui->label) { if(e->type() == QEvent::MouseButtonPress) { //静态类型转换 QMouseEvent *ev = dynamic_cast(e);//会做类型检查,相对安全,但是带来的成本高于static_cast //QMouseEvent *ev = static_cast(e); QString str = QString("EventFilter函数中,鼠标按下了 x = %1,y=%2 globalX =%3 globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY()); qDebug() delete ui;} if (maybeSave()) //如果还有需要保存的数据 { writeSettings(); event-accept(); } else //取消关闭窗口 { event-ignore(); } }类似的还有**keyEvent()**获取键盘事件函数, **keyReleaseEvent()**键盘按下事件函数,enterEvent光标进入组件事件函数, leaveEvent光标离开组件事件函数等等。
其中QCloseEvent继承与QEvent,在QEvent中常用成员函数有
void accept (); //接收者处理当前事件void ignore (); //接收者忽略当前事件,忽略后,事件可能传递给父组件bool isAccepted(); //判断当前事件是否被