事件的传递和处理
当一个事件发生时,Qt通过构造一个QEvent对象来表示发生的事件,然后通过调用event()函数,将该事件对象发送给特定的QObject(或其子类)对象。
此函数不会对事件本身进行处理, 而是首先检查所接受到的事件类型, 然后根据事件类型来调用相应的事件处理程序,事件处理程序在处理完事件之后会返回一个bool值表示该事件是被接受,还是被忽略了。
具体流程:
一个事件发生(如按键被按下),先是检查QApplication的事件过滤器,然后进入QApplication::notify中,过滤或合并一些事件,之后进入receiver中。
进入receiver之后,也是先进入receiver自身的filter,有的事件被filter处理了,有的被filter忽略了,那么就会执行它的父类的事件处理函数(若父类也忽略,继续往上,直到最上层)。直至最后,还被filter未处理的事件,会传递到event中,event根据事件类型进行派发,将事件派发到特定的事件处理函数中。
其实事件的处理可以分为:先进入QApplication的notify=(若有)继承自QApplication的自定义类的notify->QApplication的filter->receiver的filter->receiver的event->具体的event handler。
自定义事件
//继承QEvent,包含一系列需要的数据,并要提供给其特定的event type
class MyEvent : public QEvent
{
public:
MyEvent();
MyEvent(int x, int y, int z);
static const Type type;
int x;
int y;
int z;
};
const QEvent::Type MyEvent::type = (QEvent::Type)QEvent::registerEventType()//注册自定义事件,后续判断就用这个返回的type
//对于自定义事件,必须要重写event或其他对其处理
发送事件
先说明QT的事件循环机制,就是在main函数中的QApplication.exec()执行时开始,不断执行processEvent获取事件,处理并删除事件(使用的是delete)。
1 send
直接发送到指定对象,不放入事件循环队列中,直接调用notify函数将事件派发,send的event对象必须分配在stack上(局部变量),因为send不会自动删除事件
QKeyEvent event(QEvent::KeyPress, Key_X, 'X'