事件传递机制

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事件分发器。

Table of Contents