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);
}

效果

总结

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

我不想上班,谁能帮我上啊

给TA买糖
共{{data.count}}人
人已赞赏
经验教程

Java多线程之synchronized详解

2021-3-11 17:16:00

经验教程

巧用云原生能力和工具,提升云上运维效率

2021-3-11 18:05:00

⚠️
免责声明:根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。 本站为个人博客非盈利性站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途,网站会员捐赠是您喜欢本站而产生的赞助支持行为,仅为维持服务器的开支与维护,全凭自愿无任何强求。本站部份代码及教程来源于互联网,仅供网友学习交流,若您喜欢本文可附上原文链接随意转载。
无意侵害您的权益,请发送邮件至 momeis6@qq.com 或点击右侧 私信:momeis 反馈,我们将尽快处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索