qt 事件传递过程
使用版本qt5.11
给application 安装eventfilter后,看了下qt的事件 传递过程。如下一个按键一个按键事件的处理。
bool eventFilter(QObject *watched, QEvent *event)
{
if(event->type()== QEvent::KeyPress)
{
qDebug() << watched->objectName()<<" "<<watched->metaObject()->className()<<" "<<event->type();
QObject *ptr = m_watched->parent();
if(watched->parent())
{
qDebug()<<"have parent";
if( watched->parent()==m_watched)
qDebug()<<"getted watched";
}
}
return QObject::eventFilter(watched,event);
}
如果在eventfilter 中对event处理后不返回false,事件会从继续传递,首先到接收事件的对象,再给其父对象,逐层递归。正常的所有的事件都能在父对象中通过重载的各种事件处理接口获取到事件,如 keypressevent(QKeyEvent *event) ,mouseMoveEvent(QMouse*event);。
从上面圈出的地方可以看出,qt所有的窗体有一个 隐藏的父窗体对象,该对象用于向程序中其他对象分发事件。