Qt之事件过滤器应用

  mylineedit.h如下:

#ifndef MYLINEEDIT_H
#define MYLINEEDIT_H

#include <QLineEdit>

class MyLineEdit : public QLineEdit {
    Q_OBJECT
public:
    explicit MyLineEdit ( QWidget *parent = 0 );
    bool event ( QEvent *event );
protected:
    void keyPressEvent ( QKeyEvent *event );
signals:
public slots:
};

#endif // MYLINEEDIT_H

  widget.h如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
    class Widget;
}

class MyLineEdit;

class Widget : public QWidget {
    Q_OBJECT
public:
    explicit Widget ( QWidget *parent = 0 );
    ~Widget();
    bool eventFilter ( QObject *obj, QEvent *event );
protected:
    void keyPressEvent ( QKeyEvent *event );
private:
    Ui::Widget *ui;
    MyLineEdit *lineEdit;
};

#endif // WIDGET_H

  widget.cpp如下:

#include "widget.h"
#include "ui_widget.h"
#include "mylineedit.h"
#include <QKeyEvent>
#include <QDebug>

Widget::Widget ( QWidget *parent ) : QWidget ( parent ), ui ( new Ui::Widget ) {
    ui->setupUi ( this );
    lineEdit = new MyLineEdit ( this );
    lineEdit->move ( 100, 100 );
    lineEdit->installEventFilter ( this ); /* 在Widget上为lineEdit安装事件过滤器 */
}

Widget::~Widget() {
    delete ui;
}

void Widget::keyPressEvent ( QKeyEvent *event ) {
    qDebug() << tr ( "Widget键盘按下事件" );
}

bool Widget::eventFilter ( QObject *obj, QEvent *event ) { /* 事件过滤器 */
    if ( obj == lineEdit ) { /* 如果是lineEdit部件上的事件 */
        if ( event->type() == QEvent::KeyPress ) {
            qDebug() << tr ( "Widget的事件过滤器" );
        }
    }

    return QWidget::eventFilter ( obj, event );
}

  mylineedit.cpp如下:

#include "mylineedit.h"
#include <QKeyEvent>
#include <QDebug>

MyLineEdit::MyLineEdit ( QWidget *parent ) : QLineEdit ( parent ) {
}

void MyLineEdit::keyPressEvent ( QKeyEvent *event ) { /* 键盘按下事件 */
    qDebug() << tr ( "MyLineEdit键盘按下事件" );
    QLineEdit::keyPressEvent ( event ); /* 执行QLineEdit类的默认事件处理 */
    event->ignore(); /* 忽略该事件 */
}

bool MyLineEdit::event ( QEvent *event ) { /* 事件 */
    if ( event->type() == QEvent::KeyPress ) {
        qDebug() << tr ( "MyLineEdit的event()函数" );
    }

    return QLineEdit::event ( event ); /* 执行QLineEdit类event函数的默认操作 */
}

在这里插入图片描述
  在事件过滤器中,先判断该事件的对象是不是lineEdit,如果是,再判断事件类型。最后返回了QWidget类默认的事件过滤器的执行结果。
  可以看到,事件的传递顺序是这样的:先是事件过滤器,然后是该部件的event函数,最后是该部件的事件处理函数。这里还要注意,event和事件处理函数是在该部件内进行重新定义的,而事件过滤器却是在该部件的父部件中进行定义的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值