Qt事件(Event)

事件Event

  • 1、事件的概述
  • 2、通过QLabel了解事件的操作
  • 3、重写事件:
  • 4、重写鼠标按下事件:
  • 5、获取鼠标按下或移动的坐标
  • 6、查看的QMouseEvent的信息
  • 7、判断button的返回值:
  • 8、判断鼠标的哪个按键按下
  • 9、判断鼠标的坐标
  • 10、鼠标跟踪:(用户 不用按下鼠标 也可以获得鼠标移动位置)
  • 11、只需要在MyLabel的构造函数中设置一下就行:
  • 事件分发器
    • 概述:
    • 1、案例:在事件分发器中 处理鼠标单击事件
      • 1.1、重写 分发器事件(MyLabel类中)
      • 1.2、判断出事鼠标单击:QEvent::MouseButtonPress
  • 事件过滤器
    • 概述:
    • 1、在MyLabel.cpp的构造函数中 加载 事件过滤器
    • 2、重写事件过滤器
    • 注意:

1、事件的概述

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

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

Qt事件(Event)_第5张图片
如果重写QLabel事件 需要在自定义的label控件中实现 事件的重写
Qt事件(Event)_第6张图片
Qt事件(Event)_第7张图片
在mylabel.h中修改如下:
Qt事件(Event)_第8张图片

#ifndef MYLABEL_H
#define MYLABEL_H
#include 
//MyLabel 继承于  QLabel  就可以在MyLabel类中 重写 QLabel的事件
class MyLabel : public QLabel
{
    Q_OBJECT
public:
    explicit MyLabel(QWidget *parent = 0);
signals:
public slots:
};
#endif // MYLABEL_H

在mylabel.cpp修改如下:
Qt事件(Event)_第9张图片

#include "mylabel.h"

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

}

Qt事件(Event)_第10张图片
提升label的类型 为MyLabel
Qt事件(Event)_第11张图片
Qt事件(Event)_第12张图片
总结:如果想重写 某个类的事件 一般情况 就要自定义一个类 继承于该控件的类型
然后将控件的类 提升成 自定义的类 这样我们就可以在自定义类中 重写控件类型事件函数

3、重写事件:

事件资料:
Qt事件(Event)_第13张图片
Qt事件(Event)_第14张图片
Qt事件(Event)_第15张图片
Qt事件(Event)_第16张图片
mylabel.h

Qt事件(Event)_第17张图片
mylabel.cpp
Qt事件(Event)_第18张图片
运行结果:
Qt事件(Event)_第19张图片

4、重写鼠标按下事件:

Qt事件(Event)_第20张图片
mylabel.h
Qt事件(Event)_第21张图片
mylabel.cpp
Qt事件(Event)_第22张图片
Qt事件(Event)_第23张图片

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

Qt事件(Event)_第24张图片

6、查看的QMouseEvent的信息

Qt事件(Event)_第25张图片
Qt事件(Event)_第26张图片
在这里插入图片描述

7、判断button的返回值:

Qt事件(Event)_第27张图片
Qt事件(Event)_第28张图片
Qt事件(Event)_第29张图片

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

Qt事件(Event)_第30张图片
运行结果:
Qt事件(Event)_第31张图片

9、判断鼠标的坐标

Qt事件(Event)_第32张图片
运行结果:
Qt事件(Event)_第33张图片

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

在QWidgetd的Public Functions中找到
Qt事件(Event)_第34张图片

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

Qt事件(Event)_第35张图片
运行结果:
Qt事件(Event)_第36张图片

事件分发器

概述:

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

Qt事件(Event)_第38张图片
Qt事件(Event)_第39张图片
Qt事件(Event)_第40张图片
Qt事件(Event)_第41张图片
Qt事件(Event)_第42张图片

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

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

virtual bool event(QEvent *e)

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

Qt事件(Event)_第43张图片
mylabel.h声明重写事件分发器
Qt事件(Event)_第44张图片
mylabel.cpp 重写事件分发器
Qt事件(Event)_第45张图片
Qt事件(Event)_第46张图片

事件过滤器

概述:

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

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

Qt事件(Event)_第49张图片

2、重写事件过滤器

在mylabel.h中声明 事件过滤器函数
Qt事件(Event)_第50张图片
在mylabel.cpp中实现 事件过滤器函数
Qt事件(Event)_第51张图片
运行结果:
Qt事件(Event)_第52张图片

注意:

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

你可能感兴趣的:(Qt,c++,过滤器,qt)