事件分发
什么是事件?(9)里面的鼠标,(10)里面的计时器,都是qt的事件——只不过,他们并不是直接面向应用的,在事件和app中间,还夹着一个分发器
bool event(QEvent *ev);
如果返回值是true,证明用户要处理这个事件,不再向外分发了
首先,我们先查一下帮助文档
在下面找到Mouse相关,就可以找到枚举值
于是,我们在头文件生命event后可以重写它
//mylabel.cpp
bool mylabel::event(QEvent *e)
{
if(e->type() == QEvent::MouseButtonPress)//说明在做鼠标摁下拦截
{
qDebug() << "拦截";
}
}
运行程序,你就会发现……
我文本框没了!我放在中间那么大一文本框!
事实上,它并没有消失,不信你摁摁中间那个位置,下面会打印的
为什么呢?请看左上角,有个巨大的bool
我们只是重写了一部分event函数,需要返回它父类的值
所以应该是这样的
bool mylabel::event(QEvent *e)
{
if(e->type() == QEvent::MouseButtonPress)//说明在做鼠标摁下拦截
{
qDebug() << "拦截";
return true;//说明程序自己处理这个事件
}
return QLabel::event(e);
}
虽然它成功了,但这个东西其实并不用来拦截……就,举个例子说明它的用法和权限。
事件过滤
其实,在事件分发前,还有一层过滤
使用它,有两个步骤
1,给控件安装事件过滤器
ui -> label -> installEventFilter(this);
2,重写eventfilter过滤器
bool Widget::eventFilter(QObject * obj , QEvent * e)
{
if(e->type() == QEvent::MouseButtonPress)//说明在做鼠标摁下拦截
{
qDebug() << "过滤";
return true;//说明程序自己处理这个事件
}
return QWidget::eventFilter(obj,e);
}
打印的是过滤而非拦截,所以能看出,过滤先于分发