Qt|控件的事件过滤使用与总结

480 阅读2分钟

「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」。

在Qt的事件模型中,提供了一种事件过滤器功能。可以使一个Object对象监视另一个OBject对象中的事件。通过在一个QObject对象中安装时间过滤器,可以在事件到某个对象前捕获时间,从而起到了监视该对象的作用。

在这里,我们使用QLabel控件来说明,该控件是一个静态控件,只能用于展示图片、文本。无法响应鼠标按下、弹起甚至是移动等事件。那么我们就需要采用事件过滤器来进行处理,在使用QLabel控件的QWidget窗口中进行监视。

接下来的例子就是以QLabel响应鼠标按下消息为例。

第一步:重载监视函数

bool eventFilter(QObject * watched, QEvent * event);

其中,eventFillter()函数是QObject的事件监视函数。

第二步:对需要安装监视的控件安装事件过滤器

ui.lable->installEventFilter(this);

其中,intallEventFilter()函数为每一个控件安装事件过滤器,指定整个窗体作为监视事件的对象

函数原型,如下:

void QObject::installEventFilter{QObject *filterObj}

参数是监视事件的对象,该对象可以通过eventFilter()函数接收事件。

某个事件需要被过滤,停止正常的事件响应,eventFilter返回值为True,否则返回值为False。

如果在使用过程中,不需要再监视该控件时,需要移动监视

QObject::removeEventFilter()

第三步:事件监视器具体实现监视

判断当前发生事件的对象

if(watched == ui.lable)
{
    //属于当前对象
}

判断该对象的事件类型

if(event->type() == QEvent::MouseButtonPress)
{
    //查询到匹配事件后,做相应处理。
}

到这里,就可以准确的查找出鼠标此时点击的是QLabel控件,可以在注释位置添加对应的实际代码操作。

假设,需要将事件event转换为鼠标事件

QMouseEvent *mouseEvent = (QMouseEvent*)event;
if(mouseEvent->buttons() & Qt::LeftButton)
{
    //鼠标左键
}

只是用鼠标左键消息做参考,鼠标右键消息类似,这里就不再过多说明了。

以上就是使用Qt的事件过滤器处理的方法,很多情况下对于QWidget窗口也会用到该方式,比如说,当前子窗口处于展示状态,点击窗口之外的其他位置需要隐藏该子窗口。

我是中国好公民st,一名C++开成程序猿~