子控件的鼠标消息怎么传递给父控件?
需求是在父widget上摆一个子widget后,当click子widget时:不进入到子widget的相关事件处理函数中,而是进入到父widget的对应事件处理函数中。比如进入到mousePressEvent()事件。通常情况下是子widget接收到消息,而父widget接收不到消息。毕竟:click的是子widget,其遮挡住了父widget,从而父widget接收不到这个事件。
我做了一个测试: 在一个QWidget上建了一个QLabel。而后实现父QWidget的mousePressEvent(), 然后跟一下发现:当我click这个label时:居然能进入到父QWidget的mousePressEvent()中!但是如果把子改成QPushButton则进入不了!
咨询了一下别人,得到的答案是:如果子widget没有accept或ignore该事件,则该事件会被传递给其父亲。
事实也确实如此:
①对于QLabel: 如果不重写mouse处理函数,也没有设置事件过滤器等操作的话,则相当于:其对mouse这个事件一直没有进行处理,那没有进行处理的话,相当于上边所说的情况,此时该事件会被传递给其parent。
②而对于QPushButton而言:当click它时:其会发射clicked()信号,其实这就相当于它对该事件的一个operator过程。所以:这里它accept该事件并进行了对应处理。从而:无法传递给其父窗口。
那么:对于一个继承而来的类,只要我们重写实现了其各个事件处理函数,则对应的事件肯定无法传递给其父widget! 哪怕重写的该事件处理函数的函数体为空!
如果是标准的控件对象,则其肯定没重写各个事件处理函数。那消息能不能传递到父widget中,则取决于中途有没有使用事件过滤器等将该信号拦截下来了。
解决方案:
1. setAttribute(Qt::WA_TransparentForMouseEvents, true);
2. 例子:
假设红色控件在绿色控件之下,要使红色控件在绿色控件下面还可以进行鼠标拖动,绿色控件截获到鼠标事件后,“绕过”自己,向后面的控件发送消息:
void 绿色控件::mouseMoveEvent( QMouseEvent *e )
{QWidget::mouseMoveEvent(e);MyMouseEvent(e);
}void 绿色控件::mousePressEvent( QMouseEvent *e )
{QWidget::mousePressEvent(e);MyMouseEvent(e);
}void 绿色控件::mouseReleaseEvent( QMouseEvent *e )
{QWidget::mouseReleaseEvent(e);MyMouseEvent(e);
}void 绿色控件::mouseDoubleClickEvent( QMouseEvent *e )
{QWidget::mouseDoubleClickEvent(e);MyMouseEvent(e);
}void 绿色控件::MyMouseEvent( QMouseEvent *e )
{if (this->parentWidget()){// 将自己设为鼠标事件透明并重新搜索是否有后面的控件会响应鼠标事件。this->setAttribute(Qt::WA_TransparentForMouseEvents, true);QPoint pt = this->mapTo(this->parentWidget(), e->pos());QWidget *w = this->parentWidget()->childAt(pt);if (w){pt = w->mapFrom(this->parentWidget(), pt);QMouseEvent *event = new QMouseEvent(e->type(), pt, e->button(), e->buttons(), e->modifiers());QApplication::postEvent(w, event);}// 将自己设为鼠标事件不透明,以免影响button的功能this->setAttribute(Qt::WA_TransparentForMouseEvents, false);}
}
参考文章:https://blog.csdn.net/qq_32250025/article/details/78257215
https://www.cnblogs.com/qq78292959/archive/2012/08/19/2646210.html
子控件的鼠标消息怎么传递给父控件?相关推荐
- vue按钮点击事件不传递到父控件
<button @click.stop="mapClick" class="cu-btn round sm " :class="[borders ...
- vb检测html事件,VB代码VB小程序:捕获 WebBrowser 控件的鼠标事件
49. 捕获 WebBrowser 控件的鼠标事件 VB 的网页浏览控件 WebBrowser 没有 MouseDown.MouseMove.MouseUp 等鼠标事件,要在程序中捕获这些事件,必须另 ...
- 超出父控件怎么才能点击
首先:我们先总结一下控件不能交互的原因有哪些? // 1.控件的用户交互被关闭了! -> userInteractionEnable = NO[用户交互]!// 2.控件隐藏了! hidden ...
- 151202storyboard中, 设置子控件和父控件的高宽比
选择子控件label,点control 连接到父控件view 松手后弹出对话框 选择高宽比,equal widths 或equal heights 然后点击Size inspector->Con ...
- android 获取控件高度_安卓开发入门教程UI控件_ImageView
什么是ImageView ImageView是用于显示图片的UI控件. 基础样例 1.展示本地图片 效果图 代码 <ImageViewandroid:layout_width="wra ...
- android 获取控件高度_安卓开发入门教程UI控件_ProgressBar
什么是ProgressBar ProgressBar是用于提示用户进行等待的UI控件,. 基础样例 1.loading图 效果图 代码 布局文件代码 <ProgressBarandroid:id ...
- 将鼠标消息发送给指定的父控件_勾子
以下类通过挂载勾子原理,实现将子控件鼠标消息发送给父控件. 调用: MousePreview mp=new MousePreview(pControl); //pControl为父控件 //启用勾子 ...
- MFC中动态创建控件及添加消息响应的方法实例
动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个容器,一般是对话框, ...
- list控件响应鼠标键的单双击
前面一片博客磁盘文件目录罗列和list控件的使用 写过关于list控件的一点使用方法.这篇博客接着继续讲list控件,当我把某个磁盘下的文件目录列出来显示在list控件中,我们肯定是想要对这些目录进行 ...
最新文章
- NVIDIA A100 GPUs上硬件JPEG解码器和NVIDIA nvJPEG库
- 生化医学文章模式图素材
- 《Credit Risk Scorecard》第五章: Development Database Creation
- 怎么复制远程服务器上的文件夹,Linux系统复制文件/文件夹到远程服务器
- NET问答:什么场景下应该选择 struct 而不是 class ?
- 让领导狂夸,让业务目瞪口呆的报表,竟然是这样?
- java enum 长度限制_Java中的Enum的使用与分析
- linux命名管道进程间通信,《Linux 进程间通信》命名管道:FIFO
- 送书丨超级畅销书《漫画算法》50 本免费送!
- 安装nvidia-docker
- 浅析《数据安全能力成熟度模型》
- 小步快跑 快速迭代(整理)
- 最大公约数的四种求法(暴力、短除法、辗转相除法递归和非递归)
- 文件夹别名路径 请求图片时报错
- inno setup使用1 记录一下相关参数
- USB接口HID类设备——1)理论知识
- 利用无线信号传输的远程红绿灯辨识系统
- 基于希克斯需求价格弹性计算_西方经济学(微观部分)计算题
- CP56time2a解码
- linux未安装MySQL但有进程_Linux_RedHat下安装MySQL出现的问题及解决方法