zoukankan      html  css  js  c++  java
  • Qt事件处理(四)

       Qt处理事件的第四种方式:"在QApplication中注册事件过滤器",如果一个事件过滤器被注册到程序中唯一的QApplication对象,应用程序中所有对象里的每一个事件都会在它们被送达其他事件事件过滤器之前,首先抵到这个eventFilter()函数。

      在这里继承一个QWidget用来注册QApplication事件过滤器,MyWidget的头文件mywidget.h如下:

    #ifndef MYWIDGET_H
    #define MYWIDGET_H
    
    #include <QWidget>
    #include <QMouseEvent>
    
    class MyWidget : public QWidget
    {
    public:
        MyWidget();
    protected:
        bool eventFilter(QObject *obj, QEvent *e);
    };
    
    #endif

      mywidget.cpp文件如下:

    #include "mywidget.h"
    
    MyWidget::MyWidget()
    {
    }
    
    bool MyWidget::eventFilter(QObject *obj, QEvent *e)
    {
        //屏蔽MouseButtonPress、MouseButtonRelease和MouseMove事件
        if (e->type() == QEvent::MouseButtonPress || e->type() == QEvent::MouseButtonRelease || e->type() == QEvent::MouseMove)
        {
            return true;
        }
        return QWidget::eventFilter(obj, e);
    }

      在这里,我们把button称为目标对象,MainWindow实现了eventFilter()函数,用MainWindow来监视button,称MainWindow为监视对象。

      mainwindow.h文件如下:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QtGui/QMainWindow>
    #include <QPushButton>
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
        
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
    protected:
        bool eventFilter(QObject *obj, QEvent *e);
    private:
        QPushButton *button;
    };
    
    #endif

      mainwindow.cpp文件如下:

    #include "mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        button = new QPushButton;
        this->setCentralWidget(button);
        button->installEventFilter(this); //为button设置过滤器
    }
    
    MainWindow::~MainWindow()
    {
    }
    
    bool MainWindow::eventFilter(QObject *obj, QEvent *e)
    {
        if (obj == button)         //响应button的MouseButtonPress、MouseButtonRelease和MouseMove事件
        {
            if (e->type() == QEvent::MouseButtonPress)
            {
                QMouseEvent *event = static_cast<QMouseEvent*> (e);
                button->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);
                button->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);
                button->setText(QString("Move: %1, %2").arg(QString::number(event->x()), QString::number(event->y())));
                return true;
            }
            else
            {
                return false;
            }
        }
    
        return QMainWindow::eventFilter(obj, e);
    }

      运行程序,可以发现button不管是点击、释放还是拖动鼠标,都不会显示任何文本。因为我们已经为QApplication注册了事件过滤器,事件在到达button的监视对象MainWindow之前,会先到达QApplication的事件过滤器MyWidget的事件处理函数eventFilter()函数,该函数屏蔽了所有的MouseButtonPress、MouseButtonRelease和MouseMove事件。所以为button对象注册的事件过滤器不起作用。程序运行界面为:

                                            

  • 相关阅读:
    约瑟夫环问题
    String常用的工具类
    java 中的==和equals的深度解析
    Intellij IDEA的一些常用设置和使用小技巧
    jvm内存模型概述
    springcloud开篇
    oracle生成path的sql语句
    oracle表空间异常大
    springboot2集成activiti出错
    策略模式2
  • 原文地址:https://www.cnblogs.com/venow/p/2718026.html
Copyright © 2011-2022 走看看