比如鼠标点击消息:QApplication先获取消息--->具体应该处理的窗口::event()---> event()根据消息类型来调用具体的虚函数
1)可以重载具体的虚函数,来实现对消息的响应
2)可以重载event函数,用来处理或者截取消息。但是重写玩event之后,要把事件重新传递给具体应该处理的窗口,然后这个窗口又传递给QApplication。例如:
#include <QEvent>
bool Widget::event(QEvent *event)
{
return QWidget::event(event);
}
event相当于一个开关,可以在这个开关里面关闭某个消息机制:比如如果检测到鼠标左键按下时,直接返回。
#include <QEvent>
bool Widget::event(QEvent *event)
{
if(ev->type() == QEvent::MouseButtonPress)
return true;
return QWidget::event(event);
}
2、重写具体的虚函数以实现对事件的处理,比如鼠标按下事件:
#include <QMouseEvent>
#include <QDebug>
void Widget::mousePressEvent(QMouseEvent *event)
{
QPoint pt = event->pos(); //获取鼠标按下的位置
qDebug() << pt;
if(ev->button() == Qt::LeftButton)
{
if(ev->modifiers() == Qt::ControlModifier)
{
// handle with Control;
return;
}
// handle2 without control;
}
}
鼠标移动事件:
//构造函数中添加:
this->setMouseTracking(true); //不需要按下只要鼠标在widget上移动就能感应
//如果不将setMouseTracking设置为true,那么只有shu鼠标按下并且移动才能有mouseMoveEvent事件发生
void Widget::mouseMoveEvent(QMouseEvent *)
{
static int i=0;
qDebug() << "mouse move"<< i++;
}
鼠标事件默认情况下只能由一个窗口处理,比如如果在widget上放置了一个按钮,当鼠标在按钮上移动时,mouseMoveEvent不能感应,应为mouseMoveEvent是Widget的,不是Button的