目录
[1.1 事件介绍](#1.1 事件介绍)
[1.2 事件的处理](#1.2 事件的处理)
[1.3 按键事件](#1.3 按键事件)
[1.3.1 单个按键](#1.3.1 单个按键)
[1.3.2 组合按键](#1.3.2 组合按键)
[1.4 鼠标事件](#1.4 鼠标事件)
[1.4.1 鼠标单击事件](#1.4.1 鼠标单击事件)
[1.4.2 鼠标释放事件](#1.4.2 鼠标释放事件)
[1.4.3 鼠标双击事件](#1.4.3 鼠标双击事件)
[1.4.4 鼠标移动事件](#1.4.4 鼠标移动事件)
[1.4.5 滚轮事件](#1.4.5 滚轮事件)
一、Qt事件
1.1 事件介绍
事件是应⽤程序内部或者外部产⽣的事情或者动作的统称。在 Qt 中使⽤⼀个对象来表⽰⼀个事件。所 有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本⾝在不同的时刻发出的。当⽤⼾按 下⿏标、敲下键盘,或者是窗⼝需要重新绘制的时候,都会发出⼀个相应的事件。⼀些事件是在⽤⼾ 作时发出,如键盘事件、⿏标事件等,另⼀些事件则是由系统本⾝⾃动发出,如定时器事件。常⻅的 Qt 事件如下:

常⻅事件描述:
|--------|-------------------|
| 事件名称 | 描述 |
| 鼠标事件 | 左键、右键、滚轮、移动、按下和松开 |
| 键盘事件 | 按键类型、按键按下和松开 |
| 定时器事件 | 定时时间到达 |
| 进入离开事件 | 鼠标的进入和离开 |
| 滚轮事件 | 滚动 |
| 绘屏事件 | 重新绘屏幕的某些部分 |
| 显示隐藏事件 | 窗口的显示和隐藏 |
| 移动事件 | 窗口位置的变化 |
| 窗口事件 | 是否为当前窗口 |
| 大小改变事件 | 窗口大小改变 |
| 焦点事件 | 键盘焦点移动 |
| 拖拽事件 | 用鼠标进行拖拽 |
1.2 事件的处理
事件处理⼀般常⽤的⽅法为:重写相关的 Event 函数。
在 Qt 中,⼏乎所有的 Event 函数都是虚函数,所以可以重新实现。如:在实现⿏标的进⼊和离开事件时,直接重新实现 enterEvent() 和 leaveEvent() 即可。enterEvent() 和 leaveEvent() 函数原型如下:


示例1:
1、新建 Qt 项目,基类选择 QWidget,同时勾选 UI 界面文件,如下图示;

2、设计 UI 文件,如下图示;

3、在项目中新添加一个类:MyLabel;
先选中项目名称 QEvent,点击鼠标右键,选择 add new ... ,弹出如下对话框:

4、选择:Choose .... ,弹出如下界面:

5、此时项目中会新添加以下两个文件:

6、在帮助⽂档中查找对应的内容;

7、点击 "显⽰" 之后,出现如下内容:

8、复制 enterEvent() ,粘贴在项⽬⽂件 "mylabel.h" 中;

9、重写 enterEvent() ⽅法;

10、在 UI ⽂件中选中 Label,右键 ------> 提升为...

11、当点击 "提升为... " 之后,弹出如下对话框:

12、修改基类:


13、执⾏效果如下:当⿏标进⼊设计好的标签之后,就会在应⽤程序输出栏中打印:⿏标进⼊

⽰例2:当⿏标点击时,获取对应的坐标值;
1、在上述⽰例的基础上,在 mylabel.h 中声明 mousePressEvent() ⽅法;

2、在 mylabel.cpp 中重写 mousePressEvent() ⽅法;

实现效果如下:

⽰例:⿏标左键点击时,打印对应的坐标值,⿏标右键点击时,打印基于屏幕的坐标

1.3 按键事件
Qt 中的按键事件是通过 QKeyEvent 类来实现的。当键盘上的按键被按下或者被释放时,键盘事件便会触发。在帮助⽂档中查找 QKeyEvent 类如下:

查找按键事件中所有的按键类型:在帮助⽂档中输⼊:Qt::Key,如下图:

1.3.1 单个按键
⽰例:当某个按键被按下时,输出:某个按键被按下了;
1、新建项⽬,在头⽂件 "widget.h" 中声明虚函数 keyPressEvent();如下图:

2、在 "widget.cpp" ⽂件中重写 keyPressEvent() 虚函数;

1.3.2 组合按键
在 Qt 助⼿中搜索:Qt::KeyboardModifier,如下图⽰:

Qt::KeyboardModifier 中定义了在处理键盘事件时对应的修改键。在 Qt 中,键盘事件可以与修改键 ⼀起使⽤,以实现⼀些复杂的交互操作。KeyboardModifier 中修改键的具体描述如下:
|-------------------------|--------------------------------------------|
| Qt::NoModifier | ⽆修改键 |
| Qt::ShiftModifier | Shift 键 |
| Qt::ControlModifier | Ctrl 键 |
| Qt::AltModifier | Alt 键 |
| Qt::MetaModifier | Meta键(在Windows上指Windows键,在macOS上指Command键) |
| Qt::KeypadModifie | 使⽤键盘上的数字键盘进⾏输⼊时,Num Lock键处于打开状态 |
| Qt::GroupSwitchModifier | ⽤于在输⼊法 组之间 切换 |
⽰例:

1.4 鼠标事件
在 Qt 中,⿏标事件是⽤ QMouseEvent 类来实现的。当在窗⼝中按下⿏标或者移动⿏标时,都会产⽣⿏标事件。
利⽤ QMouseEvent 类可以获取⿏标的哪个键被按下了以及⿏标的当前位置等信息。在 Qt 帮助⽂档中查找QMouseEvent类 如下图⽰:


1.4.1 鼠标单击事件
在 Qt 中,⿏标按下是通过虚函数 mousePressEvent() 来捕获的。mousePressEvent() 函数原型如
下:
virtual protected void QWidget:: mousePressEvent (QMouseEvent * event )
⿏标左右键及滚的表⽰如下:
Qt::LeftButton ⿏标左键
Qt::RightButton ⿏标右键
Qt::MidButton ⿏标滚轮
⽰例1:⿏标左键
1、在 "widget.h" 头⽂件中声明⿏标按下事件;

2、在 "widget.cpp" ⽂件中重新实现 mousePressEvent() 函数;

实现效果如下:

⽰例2:⿏标右键:

实现效果如下:

⽰例3:⿏标滚轮

实现效果如下:

1.4.2 鼠标释放事件
⿏标释放事件是通过虚函数 mouseReleaseEvent() 来捕获的。mouseReleaseEvent() 函数原型如
下:
virtual protected void QWidget:: mouseReleaseEvent (QMouseEvent * event )
⽰例:

执⾏效果如下:

1.4.3 鼠标双击事件
⿏标双击事件是通过虚函数:mouseDoubleClickEvent() 来实现的。mouseDoubleClickEvent()
函数原型如下:
virtual protected void QWidget:: mouseDoubleClickEvent (QMouseEvent * event )
⽰例:⿏标左键双击

执⾏效果如下:

1.4.4 鼠标移动事件
⿏标移动事件是通过虚函数:mouseMoveEvent() 来实现的。同时为了实时捕获⿏标位置信息,需要通过函数 setMouseTracking() 来追踪⿏标的位置。mouseMoveEvent()函数原型如下:
virtual protected void QWidget:: mouseMoveEvent (QMouseEvent * event )
setMouseTracking()函数原型如下:
void setMouseTracking( bool enable )
说明:
setMouseTracking() 函数默认是 false,需要设置为 true,才能实时捕获⿏标位置信息。否则只有当⿏标按下时才能捕获其位置信息。
⽰例:

执⾏效果:

1.4.5 滚轮事件
在 Qt 中,⿏标滚轮事件是通过 QWheelEvent 类来实现的。滚轮滑动的距离可以通过 delta() 函数获取。delta() 函数原型如下:
int QGraphicsSceneWheelEvent:: delta() const
其中返回值代表滚轮滑动的距离。 正数表⽰滚轮相对于⽤⼾向前滑动,负数表⽰滚轮相对于⽤⼾向后滑动。
⽰例:

执⾏效果如下:
