Qt 39 Qt中的事件处理,事件ignore以及事件过滤器

学习自唐佐林老师的Qt


在这里插入图片描述

在这里插入图片描述
实验1:事件被组件对象处理后可能传递到其父组件

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* e);
    void keyPressEvent(QKeyEvent* e);
signals:
    
public slots:
    
};
#endif // MYLINEEDIT_H

Widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui/QWidget>
#include "MyLineEdit.h"
class Widget : public QWidget
{
    Q_OBJECT
    
    MyLineEdit myLineEdit;
public:
    Widget(QWidget* parent = 0);
    bool event(QEvent* e);
    void keyPressEvent(QKeyEvent* e);
    ~Widget();
};
#endif // WIDGET_H

MyLineEdit.cpp

#include "MyLineEdit.h"
#include <QDebug>
#include <QEvent>
#include <QKeyEvent>
MyLineEdit::MyLineEdit(QWidget *parent) :
    QLineEdit(parent)
{
}
bool MyLineEdit::event(QEvent* e)
{
    if( e->type() == QEvent::KeyPress )
    {
        qDebug() << "MyLineEdit::event";
    }
    return QLineEdit::event(e);
}
void MyLineEdit::keyPressEvent(QKeyEvent* e)
{
    qDebug() << "MyLineEdit::keyPressEvent";
    QLineEdit::keyPressEvent(e);
    //如果需要继续调用父组件的event 就一定要执行 e->ignore()
    // e->ignore();
}

Widget.cpp

#include "Widget.h"
#include <QDebug>
#include <QEvent>
Widget::Widget(QWidget *parent)
    : QWidget(parent), myLineEdit(this)
{
}
bool Widget::event(QEvent* e)
{
    if( e->type() == QEvent::KeyPress )
    {
        qDebug() << "Widget::event";
    }
    return QWidget::event(e);
}
void Widget::keyPressEvent(QKeyEvent* e)
{
    qDebug() << "Widget::keyPressEvent";
    QWidget::keyPressEvent(e);
}
Widget::~Widget()
{
    
}

main.cpp

#include <QtGui/QApplication>
#include "Widget.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    
    return a.exec();
}

如果忽略父组件事件处理,则 // e->ignore()
在这里插入图片描述
如果需要执行父组件 事件处理,则 e->ignore()
在这里插入图片描述结果显示,先调用目标组件事件处理,然后调用父组件事件处理。

在这里插入图片描述
在这里插入图片描述

**加粗样式**
实验2: 事件过滤器使用

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* e);
    void keyPressEvent(QKeyEvent* e);
signals:
    
public slots:
    
};
#endif // MYLINEEDIT_H

Widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui/QWidget>
#include "MyLineEdit.h"
class Widget : public QWidget
{
    Q_OBJECT
    
    MyLineEdit myLineEdit;
public:
    Widget(QWidget* parent = 0);
    bool event(QEvent* e);
    void keyPressEvent(QKeyEvent* e);
    bool eventFilter(QObject* obj, QEvent* e);
    ~Widget();
};
#endif // WIDGET_H

MyLineEdit.cpp

#include "MyLineEdit.h"
#include <QDebug>
#include <QEvent>
#include <QKeyEvent>
MyLineEdit::MyLineEdit(QWidget *parent) :
    QLineEdit(parent)
{
}
bool MyLineEdit::event(QEvent* e)
{
    if( e->type() == QEvent::KeyPress )
    {
        qDebug() << "MyLineEdit::event";
    }
    return QLineEdit::event(e);
}
void MyLineEdit::keyPressEvent(QKeyEvent* e)
{
    qDebug() << "MyLineEdit::keyPressEvent";
    QLineEdit::keyPressEvent(e);
    // e->ignore();
}

Widget.cpp

#include "Widget.h"
#include <QDebug>
#include <QEvent>
#include <QKeyEvent>
Widget::Widget(QWidget *parent)
    : QWidget(parent), myLineEdit(this)
{
    //将Widget对象作为 myLineEdit对象的事件处理器,安装事件处理器
    myLineEdit.installEventFilter(this);
}
bool Widget::event(QEvent* e)
{
    if( e->type() == QEvent::KeyPress )
    {
        qDebug() << "Widget::event";
    }
    return QWidget::event(e);
}
void Widget::keyPressEvent(QKeyEvent* e)
{
    qDebug() << "Widget::keyPressEvent";
    QWidget::keyPressEvent(e);
}
//事件处理器工作
bool Widget::eventFilter(QObject* obj, QEvent* e)
{
    bool ret = true;
    //判断目标对象 与 事件类型,如果目标对象对象是myLineEdit,并且是按键事件
    if( (obj == &myLineEdit) && (e->type() == QEvent::KeyPress) )
    {
        qDebug() << "Widget::eventFilter";
        QKeyEvent* evt = dynamic_cast<QKeyEvent*>(e);
        //如果是这些按键 则返回 false,表示正常传递到目标对象对象myLineEdit
        //如果不是这些按键,则返回 true,表示事件被过滤,在当前函数处理,不会传递给目标对象对象myLineEdit
        switch(evt->key())
        {
        case Qt::Key_0:
        case Qt::Key_1:
        case Qt::Key_2:
        case Qt::Key_3:
        case Qt::Key_4:
        case Qt::Key_5:
        case Qt::Key_6:
        case Qt::Key_7:
        case Qt::Key_8:
        case Qt::Key_9:
            ret = false;
            break;
        default:
            break;
        }
    }
    else
    {
        ret = QWidget::eventFilter(obj, e);
    }
    return ret;
}
Widget::~Widget()
{
    
}

main.cpp

#include <QtGui/QApplication>
#include "Widget.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    
    return a.exec();
}

Guess you like

Origin blog.csdn.net/LinuxArmbiggod/article/details/115455101
39