其存在的意义:
mywidget.h:
#ifndef MYWIDGET_H
#define MYWIDGET_H #include <QWidget> namespace Ui {
class MyWidget;
} class MyWidget : public QWidget
{
Q_OBJECT public:
explicit MyWidget(QWidget *parent = );
~MyWidget();
protected:
bool event(QEvent *event);
void timerEvent(QTimerEvent *event);
//事件过滤器
bool eventFilter(QObject *obj, QEvent *e);
private:
Ui::MyWidget *ui;
}; #endif // MYWIDGET_H
mywidget.cpp:
#include "mywidget.h"
#include "ui_mywidget.h"
#include <QEvent>
#include<QTimerEvent>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this); //安装过滤器
ui->label->installEventFilter(this); } MyWidget::~MyWidget()
{
delete ui;
}
void MyWidget::timerEvent(QTimerEvent *event)
{ }
/*
*
*/
bool MyWidget::event(QEvent *event)
{
//事件分发
// switch(event->type())
// {
// case QEvent::Close:
// closeEvent();
// break;
// case QEvent::MouseMove:
// mouseMoveEvent();
// break;
// /*
// * ......
// */
// } //关闭定时器
if (event->type() == QEvent::Timer)
{
//干掉定时器
//如果返回true,事件停止传播
//在传参数的时候注意类型是否能够匹配,如这里,定时器事件的参数类型是QTimerEvent *evevt, 而这里的类型是QEvent *event
//故需要进行参数类型的转换
// QTimerEvent *ev= static_cast<QTimerEvent *event>(e);
// timerEvent(ev);
return true; }
else
{
//为了保证其他的事件能够继续的执行,在这里添加return QWidget::event(e);
//能够继续按照原来基类的方式进行处理(传播)。
//如果不添加这句话,其他事件不会起反应。
return QWidget::event(e);
}
} bool MyWidget::eventFilter(QObject *obj, QEvent *e)
{
if (obj == ui->label)
{
QMouseEvent *env = static_cast<QMouseEvent *>(e);
//判断事件
if (e->type() == QEvent::MouseMove)
{
ui->label->setText(QString("mouse move(%1,%2)").arg(env->x()).arg(env->y()));
return true ;//防止事情传播
}
else
{
return QWidget::eventFilter(obj,e);
}
}
else
{
//其他的就按照原来的方式进行处理
return QWidget::eventFilter(obj,e);
}
}