QT事件处理(四)–QApplication中注册事件过滤器

24,566次阅读
没有评论

共计 2297 个字符,预计需要花费 6 分钟才能阅读完成。

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

 

QT事件处理(四)--QApplication中注册事件过滤器

正文完
请博主喝杯咖啡吧!
post-qrcode
 
admin
版权声明:本站原创文章,由 admin 2016-05-12发表,共计2297字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码