Qt事件處理(三)


  Qt處理事件的第三種方式:"在QObject中注冊事件過濾器",如果對象使用installEventFilter()函數注冊了事件過濾器,目標對象中的所有事件將首先發給這個監視對象的eventFilter()函數。

  mybutton.h文件如下:

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QPushButton>
#include <QMouseEvent>

class MyButton : public QPushButton
{

protected:
    bool event(QEvent *e);
};

#endif

  mybutton.cpp文件如下:

#include "mybutton.h"

bool MyButton::event(QEvent *e)
{
    if (e->type() == QEvent::MouseButtonPress)
    {
        QMouseEvent *event = static_cast<QMouseEvent*> (e);
        this->setText(QString("Press: %1, %2").arg(QString::number(event->x()), QString::number(event->y())));
        return true;
    }
    else if (e->type() == QEvent::MouseButtonRelease)
    {
        QMouseEvent *event = static_cast<QMouseEvent*> (e);
        this->setText(QString("Release: %1, %2").arg(QString::number(event->x()), QString::number(event->y())));
        return true;
    }
    else if (e->type() == QEvent::MouseMove)
    {
        QMouseEvent *event = static_cast<QMouseEvent*> (e);
       this->setText(QString("Move: %1, %2").arg(QString::number(event->x()), QString::number(event->y())));
        return true;
    }

    return QPushButton::event(e); //其他事件調用基類的event()函數進行處理
}

  在這里,我們把button稱為目標對象,MainWindow實現了eventFilter()函數,用MainWindow來監視button,稱MainWindow為監視對象。

  mainwindow.h文件如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include "mybutton.h"

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
protected:
    bool eventFilter(QObject *obj, QEvent *e);
private:
    MyButton *button;
};

#endif 

  mainwindow.cpp文件如下:

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    button = new MyButton;
    this->setCentralWidget(button);
    button->installEventFilter(this); //為button設置過濾器
}

MainWindow::~MainWindow()
{
    
}

bool MainWindow::eventFilter(QObject *obj, QEvent *e)
{
    if (obj == button)
    {
        if (e->type() == QEvent::MouseButtonRelease || e->type() == QEvent::MouseMove) //屏蔽MouseButtonRelease和MouseMove事件
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    return QMainWindow::eventFilter(obj, e);
}

  運行程序,可以發現button的文本不管是點擊、釋放還是拖動鼠標,都只顯示鼠標按下的文本,因為我們已經為button注冊了事件過濾器,在監視對象MainWindow中,事件處理函數eventFilter()函數屏蔽了button的MouseButtonRelease和MouseMove事件。所以目標對象button的MouseButtonRelease和MouseMove事件得不到響應。

  故事件是先經過監視對象的eventFilter()函數,然后在響應目標對象button的所有事件,程序運行界面為:

             

 

 


免責聲明!

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



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