赞
踩
一个事件有两个信息:谁的事件和什么事件。
在不使用事件过滤器的情况下,应用程序会直接将事件发送给对应的控件对象,由对应的控件对象自己去处理,但是如果使用了事件过滤器,应用程序会将控件的事件首先发给事件过滤器,但这前提是那个控件安装了事件过滤器,这样应用程序才知道它需要被监控,才会把它的事件先发送给事件过滤器,事件过滤器在eventFilter()中对事件进行处理分发并给控件对象。
当子对象的事件发生了,首先是发送给父对象的eventFilter()函数,然后由父对象的eventFilter()函数处理完之后再分发给各个子对象的event函数。
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
btn = new QPushButton;
btn->setText("test");
QHBoxLayout *hLayout = new QHBoxLayout;
hLayout->addWidget(btn);
setLayout(hLayout);
btn->installEventFilter(this);
connect(btn, &QPushButton::pressed, this, [=](){
qDebug() << "xxx";
});
}
bool Widget::eventFilter(QObject *object, QEvent *event)
{
//监视按钮按下动作
if (object == btn && event->type() == QEvent::MouseButtonPress) {
qDebug() << "x";
return true;
}
return false;
}
当btn按钮按下时,pressed信号首先会被送到eventFilter中,经过处理后再决定是否分发到btn。在这里,只会打印出"x",而不是"xxx"。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。