Qt::WA_TransparentForMouseEvents用法

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值