qtEvent, 事件传递、事件过滤器、update()、绘图事件、鼠标事件、鼠标穿透

本文深入探讨了QT事件处理,包括构造函数内的connect、内存父类与对象树父类的区别。重点讲解了eventFilter和event在事件传递中的角色,以及如何处理鼠标事件和绘图事件,特别讨论了如何实现鼠标穿透效果。
摘要由CSDN通过智能技术生成

杂谈

构造函数内的connect

MyBtn::MyBtn(){ 
	connect( this, &QPushButton::clicked, this, [&](){ 111 } );
}

MyBtn* obj;
connect( obj, &QPushButton::clicked, this, [&](){ 222 } );

这是可以的。
点击按钮: 先调用111, 后调用222

111函数,与对象无关,所有对象执行的功能 都是完全一样的
222函数,可以与对象相关,不同的对象 执行不同的功能

内存的父类、对象树的父类

这两个概念,一定要分清楚!!!
从ui上看: my_widget的上面,有一个my_btn

对于这个my_btn来说:
1, 他的“内存的父类”,也就是 class层次上的父类
、、 class my_btn : QPushButton (即,my_btn的内存父类是: QPushButton)
、、他是“固定死的“,一旦你的my_btn类确定了,内存父类也就确定了
、、内存父类,是一个类名,不是对象

2, 他的“对象树的父类”,也就是 ui层次上的父类
、、my_btn.setParent( my_widget ); (即,my_btn的对象树父类是: my_widget)
、、他是“随时可以变的“,这个my_btn放到哪个ui上面,他的 ”对象树父类“,就是哪个
、、对象树父类,不是类名,是一个对象

QT的事件/信号处理

在这里插入图片描述
即,我们点击的这个事件e
1,先在btn2对象里,做一大堆的事情
2,然后在btn1对象里,做一大堆事情
3,最后在my_widget对象里,做一大堆事情
从btn2 -> btn1 -> my_widget,这就是一个“对象树”呀~

我们看上面,有两个核心的函数:

eventFilter

bool f = Fa.eventFilter( btn2, e );

你可能会担心,如果Fa里面,没有这个函数怎么办?QWidget里确实没有这个函数
但在QObject里:

virtual bool eventFilter(QObject *watched, QEvent *event){
    ... }

即:即使Fa里没有这个函数,他会调用: QObject的这个函数!!

一般这个函数的写法是:

bool My_widget::eventFilter(QObject *watched, QEvent *event){
   
   if( watched == btn2 ){
    ' 对特定的某个部件,处理 '
       if( event->type() == QEvent::MouseButtonPress ){
   
           // 处理
           return true; // true为拦截: 即提前终止!! 他不会进入event函数里
       }
       return false; // 其他事件,放行 (即可以正常进入event)
   }
   QWidget::eventFilter(watched, event
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值