• 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的所有事件,程序运行界面为:

                 

     

     

  • 相关阅读:
    JavaWeb:JSP标准标签库
    SpringMVC:学习笔记(6)——转换器和格式化
    SpringMVC:学习笔记(5)——数据绑定及表单标签
    SpringMVC:学习笔记(1)——理解MVC及快速入门
    SpringMVC:学习笔记(4)——处理模型数据
    SpringMVC:学习笔记(2)——RequestMapping及请求映射
    SpringMVC:学习笔记(3)——REST
    Spring MVC中使用Swagger生成API文档和完整项目示例Demo,swagger-server-api
    Spring MVC中使用Swagger生成API文档和完整项目示例Demo,swagger-server-api
    隆中对,程序员修炼之道,技术学习前进之路
  • 原文地址:https://www.cnblogs.com/venow/p/2718024.html
Copyright © 2020-2023  润新知