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.效果展示