好比鼠标点击消息:QApplication先获取消息--->具体应该处理的窗口::event()---> event()根据消息类型来调用具体的虚函数函数
1)能够重载具体的虚函数,来实现对消息的响应
2)能够重载event函数,用来处理或者截取消息。可是重写玩event以后,要把事件从新传递给具体应该处理的窗口,而后这个窗口又传递给QApplication。例如:this
#include <QEvent> bool Widget::event(QEvent *event) { return QWidget::event(event); }
event至关于一个开关,能够在这个开关里面关闭某个消息机制:好比若是检测到鼠标左键按下时,直接返回。code
#include <QEvent> bool Widget::event(QEvent *event) { if(ev->type() == QEvent::MouseButtonPress) return true; return QWidget::event(event); }
二、重写具体的虚函数以实现对事件的处理,好比鼠标按下事件:事件
#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; } }
鼠标移动事件:get
//构造函数中添加: 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的it