QT+event() + 事件过滤器

其存在的意义:

 

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 = 0);
    ~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);
    }
}

 

上一篇:[转]QT中的D指针与Q指针


下一篇:自定义信号与槽