一、说明:
    所以在 Qt 框架内部为我们提供了一些列的事件处理机制,当窗口事件产生之后,事件会经过:事件派发 -> 事件过滤->事件分发->事件处理几个阶段。Qt 窗口中对于产生的一系列事件都有默认的处理动作,如果我们有特殊需求就需要在合适的阶段重写事件的处理动作
    事件(event)是由系统或者 Qt 本身在不同的场景下发出的。当用户 按下 / 移动鼠标、敲下键盘,或者是窗口关闭 / 大小发生变化 / 隐藏或显示都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,如鼠标 / 键盘事件等;这一些事件则是由系统自动发出,如计时器事件

    二、QT的事件处理器:
    1、处理过程:
    ①、当事件产生之后,Qt 使用用应用程序对象调用 notify() 函数将事件发送到指定的窗口:

    1. [override virtual] bool QApplication::notify(QObject *receiver, QEvent *e);

    ②、事件在发送过程中可以通过事件过滤器进行过滤,默认不对任何产生的事件进行过滤

    1. // 需要先给窗口安装过滤器, 该事件才会触发
    2. [virtual] bool QObject::eventFilter(QObject *watched, QEvent *event)

    ③、当事件发送到指定窗口之后,窗口的事件分发器会对收到的事件进行分类:

    1. [override virtual protected] bool QWidget::event(QEvent *event);

    ④、事件分发器会将分类之后的事件(鼠标事件、键盘事件、绘图事件等)分发给对应的事件处理器函数进行处理,每个事件处理器函数都有默认的处理动作(我们也可以重写这些事件处理器函数),比如:鼠标事件:

    1. // 鼠标按下
    2. [virtual protected] void QWidget::mousePressEvent(QMouseEvent *event);
    3. // 鼠标释放
    4. [virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event);
    5. // 鼠标移动
    6. [virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event);

    2、处理器函数:
    Qt 提供的这些事件处理器函数都是回调函数,也就是说作为使用者我们只需要指定函数的处理动作,当某个事件被触发,Qt 框架会调用对应的事件处理器函数
    QWidget 类是 Qt 中所有窗口类的基类,在这个类里边定义了很多事件处理器函数,它们都是受保护的虚函数。我们可以在 Qt 的任意一个窗口类中重写这些虚函数来重定义它们的行为
    (1)、鼠标事件:
    鼠标按下事件:
    当鼠标左键、鼠标右键、鼠标中键被按下,该函数被自动调用,通过参数可以得到当前按下的是哪个鼠标键

    1. [virtual protected] void QWidget::mousePressEvent(QMouseEvent *event);

    鼠标释放事件:
    当鼠标左键、鼠标右键、鼠标中键被释放,该函数被自动调用,通过参数可以得到当前释放的是哪个鼠标键

    1. [virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event);

    鼠标双击事件:
    当鼠标双击该函数被调用,通过参数可以得到是通过哪个鼠标键进行了双击操作

    1. [virtual protected] void QWidget::mouseDoubleClickEvent(QMouseEvent *event);

    鼠标进入事件:
    当鼠标进入窗口的一瞬间,触发该事件,注意:只在进入的瞬间触发一次该事件

    1. [virtual protected] void QWidget::enterEvent(QEvent *event);

    鼠标离开事件:
    当鼠标离开窗口的一瞬间,触发该事件,注意:只在离开的瞬间触发一次该事件

    1. [virtual protected] void QWidget::leaveEvent(QEvent *event);

    (2)、键盘事件:
    键盘按下事件:
    当键盘上的按键被按下了,该函数被自动调用,通过参数可以得知按下的是哪个键

    1. [virtual protected] void QWidget::keyPressEvent(QKeyEvent *event);

    键盘释放事件:
    当键盘上的按键被释放了,该函数被自动调用,通过参数可以得知释放的是哪个键

    1. [virtual protected] void QWidget::keyReleaseEvent(QKeyEvent *event);

    (3)、窗口重绘事件:
    当窗口需要刷新的时候,该函数就会自动被调用。窗口需要刷新的情景很多,比如:窗口大小发生变化,窗口显示等,另外我们还可以通过该函数给窗口绘制背景图,总之这是一个需要经常被重写的一个事件处理器函数

    1. [virtual protected] void QWidget::paintEvent(QPaintEvent *event);

    (4)、窗口关闭事件:
    当窗口标题栏的关闭按钮被按下并且在窗口关闭之前该函数被调用,可以通过该函数控制窗口是否被关闭

    1. [virtual protected] void QWidget::closeEvent(QCloseEvent *event);

    (5)、重置窗口大小事件:
    当窗口的大小发生变化,该函数被调用

    1. [virtual protected] void QWidget::resizeEvent(QResizeEvent *event);

    2、重写事件处理器函数:

    三、

    四、