Qt助手中对Qt::WA_TransparentForMouseEvents的解释如下:

When enabled, this attribute disables the delivery of mouse events to the widget and its children. Mouse events are delivered to other widgets as if the widget and its children were not present in the widget hierarchy; mouse clicks and other events effectively "pass through" them. This attribute is disabled by default.

大意是:

当该属性被激活启用时,将会使所有发送到窗体和窗体内部子控件的鼠标事件无效。鼠标事件被分发到其它的窗体部件,就像本窗体部件及本窗体内的子控件没有出现在窗体层次体系中。鼠标单击和鼠标其它事件高效地穿过(即绕开)本窗体部件及其内的子控件,这个属性默认是禁用未开启的。

测试例子如下:

#include "QtWidgetsApplication1.h"
#include "QtTestWidget.h"
#include<QDebug>QtWidgetsApplication1::QtWidgetsApplication1(QWidget* parent): QWidget(parent)
{ui.setupUi(this);setWindowTitle("parent");QtTestWidget* p = new QtTestWidget(this);QVBoxLayout* pLayout = new QVBoxLayout(this);pLayout->addWidget(p);pLayout->addWidget(ui.pushButton);setLayout(pLayout);// 设置本窗体上的类型为QtTestWidget的子窗体p的// Qt::WA_TransparentForMouseEvents属性为true,则// 在p上单击鼠标左键,不能响应QtTestWidget的mousePressEvent函数。p->setAttribute(Qt::WA_TransparentForMouseEvents, true);// 本窗体将Qt::WA_TransparentForMouseEvents设置为true,在本窗体单击鼠标左键// 依然能进入本窗体的mousePressEvent函数。setAttribute(Qt::WA_TransparentForMouseEvents, true);// 设置本窗体上的一个按钮的Qt::WA_TransparentForMouseEvents为true,则// 单击该按钮,不能进入按钮的单击信号响应槽函数btnClicked。ui.pushButton->setAttribute(Qt::WA_TransparentForMouseEvents, true);connect(ui.pushButton, &QPushButton::clicked, this,    &QtWidgetsApplication1::btnClicked);
}QtWidgetsApplication1::~QtWidgetsApplication1()
{}// 当按钮的Qt::WA_TransparentForMouseEvents为true,单击按钮,该函数不能响应
void QtWidgetsApplication1::btnClicked()
{qDebug() << "btnClicked" << "\r\n";
}// 即使设置了本窗体的Qt::WA_TransparentForMouseEvents为true,该函数依然能进入
void QtWidgetsApplication1::mousePressEvent(QMouseEvent* event)
{qDebug() << "mousePressEvent" << "\r\n";
}

QtTestWidget.cpp如下:

#include "QtTestWidget.h"
#include<QDebug>QtTestWidget::QtTestWidget(QWidget *parent): QWidget(parent)
{ui.setupUi(this);}QtTestWidget::~QtTestWidget()
{
}void QtTestWidget::btnClicked()
{}void QtTestWidget::mousePressEvent(QMouseEvent* event)
{qDebug() << "5555" << "\r\n";QWidget::mousePressEvent(event);
}

在QtWidgetsApplication1的非pushButton占据区域即子窗体QtTestWidget占据的区域上单击鼠标右键,结果如下:

mousePressEvent mousePressEvent 

可见QtTestWidget::mousePressEvent没响应,单击pushButton,输出结果依然是上面的,可见pushButton槽函数没响应。QtWidgetsApplication1窗体即本窗体设置了setAttribute(Qt::WA_TransparentForMouseEvents, true), 但本窗体的mousePressEvent依然响应了,可见Qt::WA_TransparentForMouseEvents只对本窗体内的子窗体有效,对本窗体无效,跟Qt助手说的还是有些不同。

Qt::WA_TransparentForMouseEvents的一个应用场景如下:

有个需求:在业务开始时,线程自动向每个按钮发送clicked()信号,按钮接收到该信号后,执行该信号,从而模拟人单击按钮,但整个业务过程中,按钮不能接收键盘鼠标事件,防止人干扰线程自动模拟按钮的执行。首先想到的是调用按钮的setEnable(false)函数,这样确实可以使按钮不接收键盘鼠标消息,但按钮也不响应 clicked()信号了,也就是达不到用线程模拟人工手动按按钮的功能。

正确的做法是利用如下代码:

pBtn->setAttribute(Qt::WA_TransparentForMouseEvents, true);

即将按钮的Qt::WA_TransparentForMouseEvents设置为true。

Qt::WA_TransparentForMouseEvents用法相关推荐

  1. Qt sender()用法详解

    sender()是QObject类的方法,声明如下: QObject *sender() const; Qt助手的解释如下: Returns a pointer to the object that ...

  2. Qt Creator用法详解

    Qt自带集成开发环境(IDE),名为Qt Creator.它可以在Linux.OS X和Windows上运行,并提供智能代码完成.语法高亮.集成帮助系统.调试器和剖析器集成,还集成了所有主要的版本控制 ...

  3. QT QTableWidget 用法总结

    QTableWidget是QT程序中常用的显示数据表格的空间,很类似于VC.C#中的DataGrid.说到QTableWidget,就必须讲一下它跟QTabelView的区别了.QTableWidge ...

  4. Qt::WA_QuitOnClose用法

    Qt官方助手对该标志的解释如下: Makes Qt quit the application when the last widget with the attribute set has accep ...

  5. Qt::WA_NoMousePropagation用法

    在QT中,鼠标事件包含:鼠标按键按下,鼠标按键释放,鼠标双击事件,鼠标移动事件. 分别由下面的event handler(事件处理器,实际上就是一些可override的函数)来处理: virtual ...

  6. qt repaint 用法_qt的repaint的问题

    qt的repaint的问题 在网上找了个qt刷屏的程序, 下面是主要代码,在main函数中调用showSlot程序,以便读取图形文件,但是遇到了奇怪的问题, 程序在linux PC端运行良好,用的是u ...

  7. qt repaint 用法_Qt重绘之update,repaint详解

    Qt里面的重绘和Windows编程里面的重绘差不多.但是Qt的重绘更有特色,更加智能. 在讲之前,先说说paintEvent() paintEvent()是一个虚函数槽(slot),子类可以对父类的p ...

  8. qt repaint 用法_Qt 中update()和repaint()的区别

    void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽] 通过立即调用paintEvent()来直接重新绘 ...

  9. qt repaint 用法_Qt常用函数 记录(update erase repaint 的区别)

    一界面重载函数 使用方法: 1在头文件里定义函数 protected: void paintEvent(QPaintEvent *event); 2 在CPP内直接重载 void ---------- ...

最新文章

  1. 12 生成器和生成器函数以及各种推导式
  2. 都在说微服务,那么微服务的反模式和陷阱是什么(二)
  3. 东风本田4S店违规收取续保押金 ,电台主持在线怒怼经理,反被指无教养?
  4. 【洛谷 P4291】 [HAOI2008]排名系统(Splay,Trie)
  5. Vb股票实时交易数据采集源码
  6. 模式识别与机器学习第六章有监督学习方法
  7. VS2015 LNK2001:无法解析的外部符号 debug调试
  8. 博弈逻辑与布尔判断题
  9. java cnzz爬数据_PHPcurl抓取cnzz统计数据
  10. 备战Java后端【Day6】
  11. 影视后期制作学习(AE)(父子级链接-表达式)
  12. Linux环境非root用户配置SSH免密登录(配置原理)
  13. asm磁盘头自动备份19c-au11
  14. 基于JavaWeb+MySQL的简历信息管理系统
  15. 为什么在Google上搜不到我的网页
  16. 全球与中国DIN导轨式信号调理器市场现状及未来发展趋势
  17. Python opencv保存视频打不开
  18. 中国传媒大学计算机与网络安全学院研究生,林卫国 - 中国传媒大学 - 计算机与网络空间安全学院...
  19. 威力导演-CyberLink PowerDirector Ultimate 17 永久启用 安装教程
  20. 惠普笔记本禁用触屏功能

热门文章

  1. 他95年出生,却拥有10年编程经验
  2. 做技术的,这些观点真的扯淡!
  3. h700通话糊 索尼wi_专业的事还是要交给专业的人,盘点索尼千元以下的好耳机...
  4. 列表_月隐学python第6课
  5. python如何读取数据保存为新格式_Python Numpy中数据的常用保存与读取方法
  6. 【Rxjs】 - 解析四种主题Subject
  7. 使用display inline-block 布局时,出现的间距问题的解决办法和相关说明
  8. JAVA面对对象(一)——封装
  9. 你刚才淘宝上买衣服---具体分析技术工艺(淘宝页面显示处理的页面)
  10. 转: Executor类