事件传递机制
eventfilter向:
B->installeventfilter(A); // A控制B
bool eventfilter(QObject*, QEvent*)
{
return true; // 在此处理不继续向父组件传递
return false; // 不处理继续向上传递
return FU::eventfilter(..., ...); //使用父类的处理方式
}
以上内容不正确
事件的传递顺序是 事件过滤器 ——> 事件分发 ——> 事件处理函数
事件过滤器中如果返回值是false,表示传递给对应的对象处理。如果返回的是true,表示不继续传递给其它事件过滤器,并且终止。最后调用父类的事件过滤函数。实际测试事件过滤器中也支持ignore和accept方法
事件分发 中需要调用事件处理函数才会走处理函数, 如果返回的是false, 表示继续传递给父组件, 如果返回的是true, 表示就此终止,函数末尾需要再调用父类的event方法。
事件处理函数是事件的最后一步。accept——不再继续向父组件发送;ignore——继续向父组件发送;事件处理函数默认是accept,QWidget的方法则默认是ignore.
QEvent中return的返回值是和notify()通信,而accept和ignore是和具体的事件函数通信。
QEvent的返回值是true表示用户自己处理这个事件。并且如果是event->ignore(),就算调用true,也会向父控件传递消息。如果是accept,就算是false,也会向父控件传递消息。其实ignore和accept最好只在事件处理函数中出现。
test:
控件A包含控件B,B包含控件C,C包含button D。A/B/C中有事件过滤器,事件分发器,都返回false。D中有event,返回false。点击D,分别打印,C事件过滤器,D事件分发器,B事件过滤器,C事件分发器,A事件过滤器,B事件分发器。