Qt:为QLabel增设点击响应操作

QLabel是没有clicked()信号的,所以要创建选中QLabel的响应操作,得做一些处理。

1.为目标对象QLabel添加事件过滤器(EventFilter)

void QObject::installEventFilter(QObject *filterObj)

label->installEventFilter(this);

事件过滤器是接收发送到此对象的所有事件的对象。即上述代码中即发送到label的所有事件都会被this表示的对象所接收。且事件过滤器在组件之前接收到事件,事件过滤器能够决定是否将事件转发到组件对象。

事件过滤器filterObj通过eventFilter()函数接收事件。如果要过滤事件(即停止),eventFilter()函数必须返回true, Qt 会认为这个事件已经处理完毕,不会再将这个事件发送给其它对象,而是会继续处理事件队列中的下一事件;否则必须返回false。

如果在单个对象上安装了多个事件过滤器,则首先激活最后安装的过滤器。

2.编辑事件过滤器,捕抓鼠标点击事件
eventFilter()有两个参数,一个为具体发生事件的组件,一个为发生的事件

bool QtUIConfig::eventFilter(QObject *obj, QEvent *event)
 {
 		 //若事件过滤器接收的对象是label,且事件是鼠标释放(捕抓该事件)
		if (qobject_cast<QLabel*>(obj) == label && event->type() == QEvent::MouseButtonRelease)
		{
			if (label.second == false)//表示没有高亮
			{
				label->setStyleSheet("QLabel{border-color:rgb(0,205,0);}");//label边框设置为绿色

			}
			else
			{
				label ->setStyleSheet("");//恢复原色
				label.second = false;
			}
			return true;
		}
	}
	//return QMainWindow::eventFilter(obj, event);// pass the event on to the parent class
	return false;
}

需要注意的是,如果在eventFilter内删除了接收对象(如上述的label),则需要返回true,以防止事件发送到被删除的对象,导致程序崩溃。

(在重新实现此函数(eventFilter)时,如果要过滤掉事件,即停止进一步处理,则返回true;否则返回false。)

3.效果展示
在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值