目录
一、Qt事件
1.1 事件介绍
1.2 事件的处理
1.3 按键事件
1.3.1 单个按键
1.3.2 组合按键
1.4 鼠标事件
1.4.1 鼠标单击事件
1.4.2 鼠标释放事件
1.4.3 鼠标双击事件
1.4.4 鼠标移动事件
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() 函数原型如
下:
[virtualprotected] 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() 函数原型如
下:
[virtualprotected] void QWidget::mouseReleaseEvent(QMouseEvent *event)
⽰例:
![]()
执⾏效果如下:
![]()
1.4.3 鼠标双击事件
⿏标双击事件是通过虚函数:mouseDoubleClickEvent() 来实现的。mouseDoubleClickEvent()
函数原型如下:
[virtualprotected] void QWidget::mouseDoubleClickEvent(QMouseEvent *event)
⽰例:⿏标左键双击
![]()
执⾏效果如下:
![]()
1.4.4 鼠标移动事件
⿏标移动事件是通过虚函数:mouseMoveEvent() 来实现的。同时为了实时捕获⿏标位置信息,需要通过函数 setMouseTracking() 来追踪⿏标的位置。mouseMoveEvent()函数原型如下:
[virtualprotected] void QWidget::mouseMoveEvent(QMouseEvent *event)
setMouseTracking()函数原型如下:
void setMouseTracking(bool enable)
说明:
setMouseTracking() 函数默认是 false,需要设置为 true,才能实时捕获⿏标位置信息。否则只有当⿏标按下时才能捕获其位置信息。
⽰例:
![]()
执⾏效果:
![]()
1.4.5 滚轮事件
在 Qt 中,⿏标滚轮事件是通过 QWheelEvent 类来实现的。滚轮滑动的距离可以通过 delta() 函数获取。delta() 函数原型如下:
intQGraphicsSceneWheelEvent::delta()const
其中返回值代表滚轮滑动的距离。正数表⽰滚轮相对于⽤⼾向前滑动,负数表⽰滚轮相对于⽤⼾向后滑动。
⽰例:
![]()
执⾏效果如下:
![]()