【问题描述】
在近期开发的过程中遇到这样一个场景:透明的子窗口覆盖于父窗口之上,但需要父窗口中的部件对鼠标点击事件进行正常的响应。

正常情况下,由于子窗口覆盖于父窗口之上,鼠标点击事件会被子窗口中的部件获取,而不会被父窗口中的部件获取到,要解决这个问题,就需要让鼠标点击事件穿透子窗口,下发到父窗口的对应部件中。

【解决思路】
要实现事件的穿透,最关键的就是setAttribute(Qt::WA_TransparentForMouseEvents, true);的使用。
这个方法能将当前窗口及其子部件的鼠标事件屏蔽掉,由于我们希望鼠标点击时,是父窗口的对应部件对点击事件进行响应,所以在当前窗口的mousePressEvent()中,需要先调用此方法。之所以没有在构造函数中调用此方法,是因为如果在构造函数中调用,那么当前窗口的所有鼠标事件都不会被响应,而我的实际需求是当前窗口的部件对鼠标点击事件能够进行正常的响应,同时被当前窗口覆盖的父窗口中的部件对鼠标点击事件也能进行正常的响应,如图所示:

因此,setAttribute(Qt::WA_TransparentForMouseEvents, true);应在当前窗口的mousePressEvent()中调用,判断当前鼠标点击的位置是否属于某个父窗口部件,如果是,将鼠标点击事件下发给该部件,然后调用setAttribute(Qt::WA_TransparentForMouseEvents, false);取消对当前窗口及其子部件的鼠标事件屏蔽,以便后续当前窗口及其子部件能正常捕获鼠标事件。

【实现代码】

void ChildWidget::mousePressEvent(QMouseEvent *event)
{if (this->parentWidget()){//点下去的那一刻屏蔽当前窗口及其所有子部件的事件,此时被当前窗口遮挡住的父窗口的控件的事件被响应//为什么不到这里就结束,因为如果这样做,只要点击过一次,当前窗口及其子部件就再也不会响应鼠标事件,比如移入移出//因此点击之后还必须要把这个屏蔽取消掉//但如果中间什么也不做的话,这个属性的设置就没有意义,因为最终是false//所以需要手动将鼠标点击事件下发给父窗口中的对应部件this->setAttribute(Qt::WA_TransparentForMouseEvents, true);QPoint point = this->mapTo(this->parentWidget(), event->pos());    //将点击事件在当前部件的坐标转换为在父窗口坐标系中的坐标QWidget *widget = this->parentWidget()->childAt(point);   //判断当前点击的位置是否是父窗口的一个子部件if (widget){point = widget->mapFrom(this->parentWidget(), point);    //将当前部件在父窗口的坐标转为在当前部件自己的坐标系中的坐标QMouseEvent *mouseEvent = new QMouseEvent(event->type(), point, event->button(), event->buttons(), event->modifiers());QApplication::postEvent(widget, mouseEvent);}this->setAttribute(Qt::WA_TransparentForMouseEvents, false);}
}

这样一来,点击当前窗口透明部分时,就能触发可见的父窗口子部件的鼠标点击事件了。

【参考博客】
QT 鼠标穿透

Qt 鼠标点击事件穿透相关推荐

  1. QT实现控件不响应鼠标点击事件

    QT中很多控件都有鼠标点击的事件响应,比如QPushButton,QRadioButton.有时候我们想要实现的是:当鼠标点击控件时,不会产生响应事件.其中的一种方法是使用Qt::WA_Transpa ...

  2. 【Qt串口调试助手】1.3 - 重写ComboBox下拉框的鼠标点击事件,实现点击下拉框扫描可用串口

    由于ComboBox没有鼠标点击信号,所以如果想实现点击下拉框响应,需要重写ComboBox下拉框的鼠标点击事件.在点击事件中,添加扫描可用串口代码,实现点击下拉框时重新扫描串口.并且下拉框内容输出端 ...

  3. QT之鼠标点击事件学习

    最近在学习点击鼠标事件,在这分享给大家 window.h中的配置 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow& ...

  4. QT之QLineEdit——实现鼠标点击事件

    QLineEdit添加鼠标点击事件主要分为三步: 重写lineEdit类(MyLineEdit) 添加相应的启动的信号和槽的事件 将使用时的QLineEdit提升为自己写的类 重写lineEdit类 ...

  5. 【Qt】QT鼠标和键盘事件

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 鼠标事件 04. 键盘事件 05. 附录 01. 概述 事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者 ...

  6. PyQt5 鼠标点击事件(点击响应事件可自定义):鼠标单击、双击、滚轮滚动、释放、移动等

    自己写通了最常用的鼠标事件,具体响应事件,大家可以自定义,实现的效果如下: 具体代码如下,有任何问题,欢迎小伙伴们交流讨论. # -*- coding: utf-8 -*- ""& ...

  7. PyQt5重写QComboBox的鼠标点击事件

    最近学PyQt5,想要做一个串口调试助手来练练手,之前用了正点原子的串口上位机,觉得点击ComboBox自动检测串口这个功能很棒,之前用QT5写串口调试助手的时候也想加入这个功能,但是一直没有成功,之 ...

  8. PyQt实现QSlider滑块鼠标点击事件

    在PyQt添加SQlider滑动条后,发现鼠标点击时滑块只能按照设定步数一步步移动,不能点哪里滑块到哪里.网上查找资料后发现这方面相关参考资料比较少,且大多数文章表述对我个人来说比较难理解,最后综合参 ...

  9. QT QPushButton点击事件的实现及关闭窗口命令

    最近需要对按钮实现效果:当鼠标按下时按钮有效果1,然后鼠标松开时按钮有效果2. 分析:这里没有现成的信号可以使用,需要重载mousePressEvent 及 mouseReleaseEvent 事件函 ...

  10. css禁用鼠标点击事件

    1.css禁用鼠标点击事件 .disabled { pointer-events: none; } 转载于:https://www.cnblogs.com/jiangtuzi/p/5728230.ht ...

最新文章

  1. 【青少年编程】【Scratch】10 画笔模块
  2. 只需5行代码,手把手教你快速实现图像分割,代码逐行详解!
  3. visual studio 代码提示插件_请收好:10 个实用的 VS Code 插件
  4. webpack - 收藏集 - 掘金
  5. js怎么设置z index.html,HTML5 Canvas set z-index
  6. HTML5 实现离线数据缓存
  7. 数据结构之二叉搜索树
  8. 自动/持续部署Docker 的tomcat web项目(二)
  9. 设计一个基于GUI的扑克程序
  10. PHP生成海报 文字描边,php实现图片添加描边字和马赛克的方法
  11. 企业如何从0到1搭建BI系统
  12. calendar控件使用 extjs_Calendar 日历控件使用
  13. onlyoffice 在线编辑
  14. 问题解决模型ORID
  15. 2017第48周日昨天休息
  16. ES6特性:Promise
  17. matlab 函数句柄@的介绍_什么是函数句柄(转)
  18. 深入了解人工智能的主要缺点
  19. 【机器学习】三大树模型实战乳腺癌预测分类
  20. Maven引入依赖后自动下载并关联源码 Source

热门文章

  1. 《哈佛通识教育红皮书》 哈佛委员会著
  2. Python爬取国家税务总局纳税信用A级纳税人信息!
  3. 下午茶,几个笑话提提神
  4. 鸿蒙渊更新公告,《天下3》更新公告(版本2.0.777)
  5. PHP编程中 @符号的作用
  6. python基础之logging模块
  7. 机器学习之One-Hot Encoding详解
  8. 利用Python爬取公交地铁数据(TransBigData版)
  9. matlab设置固定的窗宽窗位,如何设定窗宽窗位,附正常人体组织CT值
  10. [iOS开发]weak底层原理