使用版本qt5.11
查看事件传递过程最简单的方式就是将传递过程打印出来。操作如下:(很简单的代码可以自己创建最简工程然后按如下方式添加进去)
给application 安装eventfilter后,看了下qt的事件 传递过程。如下一个按键一个按键事件的处理。
class EventFilter:public QObject{
virtual bool eventFilter(QObject *watched, QEvent *event) override
{
if(event->type()== QEvent::KeyPress)
{
qDebug() << watched->objectName()<<" "<<watched->metaObject()->className()<<" "<<event->type();
}
return QObject::eventFilter(watched,event);
}
}
如果在eventfilter 中对event处理后不返回false,事件会从继续传递,首先到接收事件的对象,再给其父对象,逐层递归。正常的所有的事件都能在父对象中通过重载的各种事件处理接口获取到事件,如 keypressevent(QKeyEvent *event) ,mouseMoveEvent(QMouse*event);。
从上面圈出的地方可以看出,qt所有的窗体有一个 隐藏的父窗体对象,该对象用于向程序中其他对象分发事件。