virtual bool event(QEvent *e)
是QObject的成员函数,可以重载
例如在QWidget中的作用是用来将事件分配给各个事件处理函数的
方法是
1.通过参数e->type()判断出传递过来的事件类型是什么
2.例如是QEvent::MouseMove,在通过强制转换auto temp_ev = static_cast<QMouseEvent*>(e),转换成对应的事件参数,这样调用MouseMoveEvent(temp.ev);就相当于分配好了
3.其实在通过转换的事件参数temp_ev后,可以取出更具体的参数,temp_ev->pos(),等等,可以做更详细的处理
其实这些处理都围绕着参数Qevent *e的处理,是否要自己处理,是否要发给其他函数处理
在自定义的子类中
bool Widget::event(QEvent *event)
{
if(event->type() == QEvent::KeyPress) //键盘按下处理,其他事件让事件处理器自己处理,不能返回false
{
QKeyEvent *e = static_cast<QKeyEvent *>(event);//把QEvent类型转为QKeyEvent
if(e->key() == Qt::Key_B) //如果是 键盘上的B键 将不会打印键值
{
return QWidget::event(event);
}
qDebug()<<(char)(e->key());
return true;
}
else if(event->type() == QEvent::Timer)//计数器事件
{
//此处添加处理定时器事件的内容,如果想干掉定时器就直接返回true 定时器事件就不会处理
QTimerEvent *ev = static_cast<QTimerEvent *>(event);//把QEvent类型转换为QTimerEvent
timerEvent(ev);
return true; //如果返回true,事件停止传播
}
else if(event->type() == QEvent::MouseMove)//鼠标移动事件 ,需要在构造函数中设置追踪鼠标
{
//鼠标移动处理事件,当返回true时就停止事件处理,所以在返回true前处理事件,打印坐标
QMouseEvent *ev = static_cast<QMouseEvent *>(event);//把QEvent类型转换为QMouseEvent
qDebug()<<QString("Mouse Move:(%1, %2)").arg(ev->x()).arg(ev->y());
return true; //如果返回true,事件停止传播
}
else
{
return QWidget::event(event);
}
}