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对象注册的事件过滤器不起作用。程序运行界面为:

                                            

  • 相关阅读:
    自定义View的ToolBar布局报错Error:(2) No resource identifier found for attribute 'context' in package 'c
    在学git之主分支 branch
    获取发布版SHA1
    关于开启线程与UI的操作
    播放音频和视频(VideoView控件)
    通知栏Notification的应用
    Android 真机调式 Installation failed with message 远程主机强迫关闭了一个现有的连接。. It is possible that this issue is resolved by uninstalling an existing version of the apk if it is present, and then re-installing. WA
    运行程序申请危险权限
    mysql乐观锁总结和实践
    Nginx配置文件nginx.conf中文详解
  • 原文地址:https://www.cnblogs.com/venow/p/2718026.html
Copyright © 2011-2022 走看看