写点什么

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

  • 2022 年 10 月 05 日
    河北
  • 本文字数:729 字

    阅读完需:约 2 分钟

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

在 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){    //鼠标左键}
复制代码


用户头像

书山有路勤为径,学海无涯苦作舟 2022.07.01 加入

擅长语言:C++ 涉及语言:Python

评论

发布
暂无评论
Qt|控件的事件过滤使用与总结_c++_中国好公民st_InfoQ写作社区