当前位置: 首页 > news >正文

qt事件过滤与传递机制

当点击 QLabel 时,正常情况下并不会直接触发 MyWidget 的 mousePressEvent 函数,原因在于事件的传递机制和事件过滤器的存在。下面详细分析这个过程:

事件传递机制

在 Qt 里,事件的传递是从子控件往父控件冒泡的。不过,在事件到达目标控件(也就是子控件)的事件处理函数之前,会先经过事件过滤器。

结合代码分析

事件过滤器部分

cpp

bool eventFilter(QObject *watched, QEvent *event) override {if (watched->objectName() == "childLabel" && event->type() == QEvent::MouseButtonPress) {QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);qDebug() << "[事件过滤器] 子控件被点击,全局坐标:" << mouseEvent->globalPos();return true; // 拦截事件,不再传递到子控件的mousePressEvent}return QWidget::eventFilter(watched, event);
}

当点击 QLabel 时,事件会先被传递到 MyWidget 的 eventFilter 函数。在这个函数中,会检查被监视的对象是否为 childLabel 且事件类型是否为鼠标点击事件。要是条件满足,就会输出点击的全局坐标信息,并且返回 true。返回 true 意味着事件被拦截,不会再传递到 QLabel 的 mousePressEvent 函数,更不会继续冒泡到 MyWidget 的 mousePressEvent 函数。

mousePressEvent 函数

cpp

void mousePressEvent(QMouseEvent *event) override {if (event->button() == Qt::LeftButton) {qDebug() << "[对象处理] 左键点击位置:" << event->pos();event->accept();} else {QWidget::mousePressEvent(event);}
}

这个函数是 MyWidget 的鼠标点击事件处理函数。只有当点击的是 MyWidget 本身(而非其子控件 QLabel),或者事件过滤器没有拦截事件且事件冒泡到 MyWidget 时,这个函数才会被触发。

触发 MyWidget 的 mousePressEvent 函数的情况

  • 点击 MyWidget 非子控件区域:若点击的是 MyWidget 中不包含 QLabel 的区域,事件会直接触发 MyWidget 的 mousePressEvent 函数。
  • 事件过滤器不拦截事件:若在 eventFilter 函数中,对于点击 QLabel 的事件返回 false,那么事件会继续传递到 QLabel 的 mousePressEvent 函数(前提是 QLabel 重写了该函数),若 QLabel 没有处理该事件,事件就会冒泡到 MyWidget 的 mousePressEvent 函数。

总结

点击 QLabel 时,由于事件过滤器拦截了事件,所以不会触发 MyWidget 的 mousePressEvent 函数。若要触发该函数,要么点击 MyWidget 的非子控件区域,要么让事件过滤器不拦截事件。

编辑

分享

除了鼠标点击事件,还有哪些常见的事件类型?

如何在事件过滤器中判断事件的具体类型?

如何在父控件中处理子控件的事件?

相关文章:

  • 华为云Astro canvas大屏与iotDA是怎样通过数据接入、数据中心的功能传输和通讯的?
  • 经典反转结构——案例分析
  • Java 实现目录递归拷贝
  • django之账号管理功能
  • 用Python做有趣的AI项目1:用 TensorFlow 实现图像分类(识别猫、狗、汽车等)
  • lvgl 实现横向滑动,并且捕获最中间那个元素
  • SpringCloud微服务架构
  • 基于先进MCU的机器人运动控制系统设计:理论、实践与前沿技术
  • VS BUG(6) LINK : fatal error LNK1158: 无法运行“rc.exe”
  • 用 C 语言实现通用的冒泡排序算法
  • UNO Less-to-More Generalization: 通过上下文生成解锁更多可控性
  • 使用UltraSigma给普源RIGOL示波器截图的方法
  • 基于 Python 的自然语言处理系列(86):DPO(Direct Preference Optimization)原理与实战
  • 【信息系统项目管理师】高分论文:论质量管理和进度管理(智慧旅游平台建设项目)
  • HBase协处理器深度解析:原理、实现与最佳实践
  • 基于FFmpeg命令行的实时图像处理与RTSP推流解决方案
  • 使用java代码注册onloyoffice账号 || 注册onloyoffice账号
  • vue中 vue.config.js反向代理
  • 计算机网络 | 应用层(3)-- 因特网中的电子邮件
  • 使用银行卡二要素API让支付更加安心
  • 当代视角全新演绎,《风雪夜归人》重归首都剧场
  • 一年吸引30多万人次打卡,江苏这个渔村是怎么做到的?
  • 四川公布一起影视盗版案例:1个网站2人团伙盗售30多万部
  • 儒说︱问世间孝为何物
  • 牧原股份一季度归母净利润44.91亿元,同比扭亏为盈
  • 2024年上海发生科技融资997起,位于全国第一