工业风 网站建设,东阳建设局网站,wordpress 外部调用插件,网站建设从零开始教程1. 事件过滤器
void QObject::installEventFilter(QObject *filterObj)
bool eventFilter(QObject *obj, QEvent *event); filterObj表示事件筛选器对象#xff0c;它接收发送到此QObject对象#xff08;安装事件过滤器的部件对象#xff09;的所有事件。筛选器可以停止事件…1. 事件过滤器
void QObject::installEventFilter(QObject *filterObj)
bool eventFilter(QObject *obj, QEvent *event); filterObj表示事件筛选器对象它接收发送到此QObject对象安装事件过滤器的部件对象的所有事件。筛选器可以停止事件返回true也可以将事件转发给此QObject对象返回false。事件过滤器filterObj通过它的eventFilter()函数接收事件。
//举例说明
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui-setupUi(this);lineEdit new MyLineEdit(this); //在部件A建立部件B部件A即B的父部件lineEdit-move(100, 100);lineEdit-installEventFilter(this); // 在Widget上为lineEdit安装事件过滤器
}
/** 此时filterObj为this表示窗口部件Widget。Widget接收发送到lineEdit对象的全部事件。* 可以这样理解一个部件安装了事件筛选器对象是其父部件的事件过滤器则其父部件可以接收其全部事件。*/
2. 接收事件 在Qt中事件过滤器的eventFilter函数返回值表示该事件是否被事件过滤器拦截即是否停止事件的传递。返回值是一个布尔类型的值 1当返回true时表示事件已被过滤器拦截不会传递给被监听的对象进行处理 2当返回false时事件会继续传递给被监听的对象进行处理。 3返回给基类进行处理例return QObject::eventFilter(obj, event)可以理解为没有条件的递归即死循环递归调用自己。 按F1打开帮助文档
注意 1eventFilter函数一般会被重写返回true/false是程序员自己在程序里手动添加的 2return QObject::eventFilter(obj, event)具体值其实也是每次调用自己根据是否有手动添加的true/false来决定的。默认不过滤返回false.
3. 事件的传递通过4实例中的键盘按下事件举例 4. 实例 //mylineedit.cpp
#include mylineedit.h
#include QKeyEvent
#include QDebugMyLineEdit::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()函数的默认操作
}//widget.cpp
#include widget.h
#include ui_widget.h
#include mylineedit.h
#include QKeyEvent
#include QDebugWidget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui-setupUi(this);lineEdit new MyLineEdit(this); //在部件A建立部件B部件A即B的父部件lineEdit-move(100, 100);lineEdit-installEventFilter(this); // 在Widget上为lineEdit安装事件过滤器
}Widget::~Widget()
{delete ui;
}void Widget::keyPressEvent(QKeyEvent *event)
{Q_UNUSED(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);
} 测试结果 总结
1只有installEventFilter没有eventFilter事件依旧不会被提前捕获接收。必须成对存在。
2没有event 事件传递依旧成立。