• Qt 事件过滤器


    @


    分析

    现在有这样一个场景,界面中有三个按钮,分别实现三个按钮对应槽函数,正常情况下点击是这样的
    在这里插入图片描述
    现在来使用事件过滤的方式使按钮2的点击失效

    在此之前需要知道事件的传递流
    以鼠标点击事件为例,当界面中产生一个鼠标点击事件,经过一系列乱七八糟的处理,事件来到Qt事件分发器事件分发器一看是按钮的事件嘛,然后就把事件交给按钮处理,按钮一看"哦,事件来了啊,赶紧处理,抛个信号完事"

    整个事件的流程大致就是这样

    graph LR A(事件产生)-->B(...)-->C(Qt事件分发器) C-->D(按钮)-->H(处理)

    那什么时候用到事件过滤器呢?
    试想上面的场景本来一切正常,突然有一天,按钮说"996太累了,widget你能不能帮我干一部分活",widget也是个职场老油条了,心说帮你干活可以,但是你得给我留个条,说”行,但是我怕我忘了,你给我写个条吧(安装事件过滤器)“
    于是流程又变成了这样

    graph LR D--处理安装了过滤器的控件的事件-->E(事件过滤器)-->D A(事件产生)-->B(...)-->C(Qt事件分发器)-->D(widget)-->F(按钮)-->G(处理)

    代码

    一、控件安装事件过滤器

    	// 按钮2先安装事件过滤器,指定一个对象,事件产生后会先交给指定的对象处理
    	ui.btn2->installEventFilter(this);
    

    二、在过滤器中实现事件过滤事件

    事件进入到事件过滤器中,进行自己想要的处理,返回true表示事件标记为处理完毕,那么事件将不会继续向下传递,返回false则反之
    最后如果自己不做处理的事件,别忘了交给父对象处理,

    bool test::eventFilter(QObject *watched, QEvent *event)
    {
    		if (ui.btn2 == watched)
    	{
    		if (QEvent::MouseButtonPress == event->type())
    		{
    			qDebug() << QStringLiteral("鼠标按下事件,已拦截");
    			return true;
    		}
    		else if (QEvent::MouseButtonRelease == event->type())
    		{
    			qDebug() << QStringLiteral("鼠标释放事件,已拦截");
    			return true;
    		}
    		else if (QEvent::MouseButtonDblClick == event->type())
    		{
    			qDebug() << QStringLiteral("鼠标双击事件,已拦截");
    			return true;
    		}
    	}
    	// 将事件交给父对象处理
    	return QWidget::eventFilter(watched, event);
    }
    

    效果

    在这里插入图片描述

    总结

    说白了事件过滤器就是自己不想处理的事件,交给别人来处理

    我不想上班,谁能帮我上啊
    在这里插入图片描述

    做一条有理想的咸鱼
  • 相关阅读:
    OC
    提取AppDelegate.m中的"RDVTabBarController"第三方框架的方法
    spring_aop
    spring_xml配置&依赖注入
    关于idea运行web项目时出现的浏览器问题
    Java中main方法参数类型个人粗略理解
    函数式编程_lambda
    反射_注解
    pl/sql使用小技巧
    触发器&索引&视图
  • 原文地址:https://www.cnblogs.com/Doyoung/p/14519270.html
Copyright © 2020-2023  润新知