10、event函数、事件过滤器
1、event函数将获取到的事件,交给对应的处理函数;实现事件分发,基于此,可以实现一些事件的过滤;
2、重写event()函数,返回值bool类型 type()类型触发哪一种事件
// 声明event函数 bool event(QEvent *ev);
3、事件处理
// 返回值true事件表示接受 不继续传递 bool myWidget::event(QEvent *ev) { // 实现事件分发 /* 这种实现暂时说明意思 * switch(ev->type()) { case QEvent::Close: QCloseEvent *ce = static_cast<QCloseEvent*>(ev); closeEvent(ce); break; case QEvent::MouseMove: // 需要做类型转换 //mouseMoveEvent(ev); break; }*//* if(ev->type() == QEvent::Timer) { // 可以屏蔽掉定时器 return true; }else if{ return QWidget::event(ev); // 其他事件继续传递 }else */ // 事件过滤 QKeyEvent *env = static_cast<QKeyEvent*>(ev); if(env->type() == QEvent::KeyPress) { // 只处理该事件 return QWidget::event(env); }else {// return QWidget::event(env); } }
不要轻易动event() 函数;
4、事件过滤器eventFilter()
bool eventFilter(QObject *w, QEvent *e);
控件安装事件过滤器
ui->label->installEventFilter(this);
事件处理
// 事件过滤器 bool myWidget::eventFilter(QObject *w, QEvent *e) { if(w== ui->label) { if(e->type() == QEvent::MouseMove) { // 对该事件做处理 // 处理完事件后,不需要事件继续传播 return true; }else { // 事件继续传播 return QWidget::eventFilter(w,e); } }else { return QWidget::eventFilter(w,e); } }
事件过滤器和被安装过滤器的控件必须在同一个线程,否则过滤器无效;