当前位置:   article > 正文

Qt事件(Event)

qt事件

1、事件的概述

Qt 中所有事件类都继承于QEvent。在事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
用户如果使用该事件? 由于事件函数是virtual 必须用户实现

2、通过QLabel了解事件的操作

在这里插入图片描述
如果重写QLabel事件 需要在自定义的label控件中实现 事件的重写
在这里插入图片描述
在这里插入图片描述
在mylabel.h中修改如下:
在这里插入图片描述

#ifndef MYLABEL_H
#define MYLABEL_H
#include <QLabel>
//MyLabel 继承于  QLabel  就可以在MyLabel类中 重写 QLabel的事件
class MyLabel : public QLabel
{
    Q_OBJECT
public:
    explicit MyLabel(QWidget *parent = 0);
signals:
public slots:
};
#endif // MYLABEL_H
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在mylabel.cpp修改如下:
在这里插入图片描述

#include "mylabel.h"

MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
提升label的类型 为MyLabel
在这里插入图片描述
在这里插入图片描述
总结:如果想重写 某个类的事件 一般情况 就要自定义一个类 继承于该控件的类型
然后将控件的类 提升成 自定义的类 这样我们就可以在自定义类中 重写控件类型事件函数

3、重写事件:

事件资料:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
mylabel.h


mylabel.cpp
在这里插入图片描述
运行结果:
在这里插入图片描述

4、重写鼠标按下事件:

在这里插入图片描述
mylabel.h
在这里插入图片描述
mylabel.cpp
在这里插入图片描述
在这里插入图片描述

5、获取鼠标按下或移动的坐标

在这里插入图片描述

6、查看的QMouseEvent的信息

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7、判断button的返回值:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8、判断鼠标的哪个按键按下

在这里插入图片描述
运行结果:
在这里插入图片描述

9、判断鼠标的坐标

在这里插入图片描述
运行结果:
在这里插入图片描述

10、鼠标跟踪:(用户 不用按下鼠标 也可以获得鼠标移动位置)

在QWidgetd的Public Functions中找到
在这里插入图片描述

11、只需要在MyLabel的构造函数中设置一下就行:

在这里插入图片描述
运行结果:
在这里插入图片描述

事件分发器

概述:

事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的事件处理器(event handler)。
event()函数主要用于事件的分发
在这里插入图片描述
如果你希望在事件分发之前做一些操作,就可以重写这个event()函数了。
1、如果传入的事件已被识别并且处理,则需要返回 true,否则返回 false。如果返回值是 true,那么 Qt 会认为这个事件已经处理完毕,不会再将这个事件发送给其它对象,而是会继续处理事件队列中的下一事件。
2、在event()函数中,调用事件对象的accept()和ignore()函数是没有作用的,不会影响到事件的传播。
3、记得不关心的事件 记得用父类的事件分发器处理。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1、案例:在事件分发器中 处理鼠标单击事件

1.1、重写 分发器事件(MyLabel类中)

virtual bool event(QEvent *e)
  • 1

1.2、判断出事鼠标单击:QEvent::MouseButtonPress

在这里插入图片描述
mylabel.h声明重写事件分发器
在这里插入图片描述
mylabel.cpp 重写事件分发器
在这里插入图片描述
在这里插入图片描述

事件过滤器

概述:

通过前面的章节,我们已经知道,Qt 创建了QEvent事件对象之后,会调用QObject的event()函数处理事件的分发。显然,我们可以在event()函数中实现拦截的操作。由于event()函数是 protected 的,因此,需要继承已有类。如果组件很多,就需要重写很多个event()函数。这当然相当麻烦,更不用说重写event()函数还得小心一堆问题。好在 Qt 提供了另外一种机制来达到这一目的:事件过滤器
在这里插入图片描述
不想让它继续转发,就返回 true,否则返回 false
在QObject类中Public Functions找到:
在这里插入图片描述

1、在MyLabel.cpp的构造函数中 加载 事件过滤器

在这里插入图片描述

2、重写事件过滤器

在mylabel.h中声明 事件过滤器函数
在这里插入图片描述
在mylabel.cpp中实现 事件过滤器函数
在这里插入图片描述
运行结果:
在这里插入图片描述

注意:

1、这种全局的事件过滤器将会在所有其它特性对象的事件过滤器之前调用。尽管很强大,但这种行为会严重降低整个应用程序的事件分发效率。
2、事件过滤器和被安装过滤器的组件必须在同一线程,否则,过滤器将不起作用。另外,如果在安装过滤器之后,这两个组件到了不同的线程,那么,只有等到二者重新回到同一线程的时候过滤器才会有效。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/949603
推荐阅读
  

闽ICP备14008679号