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);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM