如何自学QT(11)——event分发的理解

事件分发

什么是事件?(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);
}

打印的是过滤而非拦截,所以能看出,过滤先于分发

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值