目录
2.实现(先判断是否是要过滤事件的组件,如果是是要过滤事件的组件,再去判断事件是否过滤,如果过滤返回true,如果不过滤返回false;如果不是要过滤事件的组件,返回父类的事件过滤函数)
一、重写事件分发函数监听按钮
1.事件函数写入头文件
Event的返回值是bool,不是void,因此使用bool
注意是bool,而非void
2.在.cpp中实现事件函数
bool Widget::event(QEvent *event)
{
//判断事件类型(键盘事件)
if(event->type()==QEvent::KeyPress){
QKeyEvent *keyEvent= static_cast<QKeyEvent *>(event);//将event类型转变为KeyEvent类型
if(keyEvent->key()==Qt::Key_Tab){
qDebug()<<"Tab键被按下";
return true;//事件处理完毕,返回
}
}
return QWidget::event(event);//跳出当前判断,继续处理其他事件
}
注意事项:
- 事件分发函数的返回值bool。
- 我们处理过自己感兴趣的事件之后,可以直接返回true,表示我们已经对此事件进行了处理;对于其它我们不关心的事件,则需要调用父类的event()函数继续转发,否则这个组件就只能处理我们定义的事件了。
二、事件过滤器(了解)
1.重写声明函数
2.实现(先判断是否是要过滤事件的组件,如果是是要过滤事件的组件,再去判断事件是否过滤,如果过滤返回true,如果不过滤返回false;如果不是要过滤事件的组件,返回父类的事件过滤函数)
3.安装
void QObject::installEventFilter(QObject *filterObj)
4.移除
void QObject::removeEventFilter(QObject *obj)
三、总结
事件处理有以下四个过程:
- 事件处理:重写鼠标按下事件、鼠标释放事件,这个是最简单的形式及功能。
- 事件分发:重新event函数。
- 事件过滤:重写eventFilter,过滤特定对象的事件,或者所有对象的所有事件(QCoreApplication::instance)。
- 事件派发:(QcoreApplication::notify)。