事件
问题
窗口上有一个
button
- 用户可以通过
asdf按键上下左右移动- 当鼠标在窗口上时会有提示用户r操作
使用信号和槽显然不合适,没对应按键移动的信号,窗口鼠标信号,这如何处理?如果需要按键双击、鼠标双击呢?
可以通过事件直接处理(本篇文章),也可以自定义信号处理(下一篇文章)

事件
概念
- 事件表示应用程序中发生的操作或变化,如移动鼠标、点击鼠标、按下按键等。
- 在 Qt 中,事 件是对象,是
QEvent类或其派生类的实例,例如 QKeyEvent 是按键事件类,适合没有对应槽函数或者需要自定义槽函数的场景
类型

常见的事件类型及其所属的事件类
| 事件类 | 事件类型 | 事件描述 |
|---|---|---|
| QMouseEvent | QEvent::MouseButtonDblClick | 鼠标双击 |
| QEvent::MouseButtonPress | 鼠标按键按下,可以是左键或右键 | |
| QEvent::MouseButtonRelease | 鼠标按键释放,可以是左键或右键 | |
| QEvent::MouseMove | 鼠标移动 | |
| QWheelEvent | QEvent::Wheel | 鼠标滚轮滚动 |
| QHoverEvent | QEvent::HoverEnter | 鼠标光标移动到组件上方并悬停(hover),需设置 Qt::WA_Hover 属性 |
| QEvent::HoverLeave | 鼠标光标离开某个组件上方 | |
| QEvent::HoverMove | 鼠标光标在组件上方移动 | |
| QEnterEvent | QEvent::Enter | 鼠标光标进入组件或窗口边界范围内 |
| QEvent | QEvent::Leave | 鼠标光标离开组件或窗口边界范围 |
| QKeyEvent | QEvent::KeyPress | 键盘按键按下 |
| QEvent::KeyRelease | 键盘按键释放 | |
| QFocusEvent | QEvent::FocusIn | 组件或窗口获得键盘的输入焦点 |
| QEvent::FocusOut | 组件或窗口失去键盘的输入焦点 | |
| QEvent::FocusAboutToChange | 组件或窗口的键盘输入焦点即将变化 | |
| QShowEvent | QEvent::Show | 窗口在屏幕上显示出来,或组件变得可见 |
| QHideEvent | QEvent::Hide | 窗口在屏幕上隐藏,或组件变得不可见 |
| QMoveEvent | QEvent::Move | 组件或窗口的位置移动 |
| QCloseEvent | QEvent::Close | 窗口或组件被关闭,例如 QTabWidget 的一个页面被关闭 |
| QPaintEvent | QEvent::Paint | 界面组件需要更新重绘 |
| QResizeEvent | QEvent::Resize | 窗口或组件改变大小 |
| QStatusTipEvent | QEvent::StatusTip | 请求显示组件的 statusTip 信息 |
| QHelpEvent | QEvent::ToolTip | 请求显示组件的 toolTip 信息 |
| QEvent::WhatsThis | 请求显示组件的 whatsThis 信息 | |
| QDragEnterEvent | QEvent::DragEnter | 在拖放操作中,鼠标光标移动到组件上方 |
| QDragLeaveEvent | QEvent::DragLeave | 在拖放操作中,鼠标光标离开了组件 |
| QDragMoveEvent | QEvent::DragMove | 拖放操作正在移动过程中 |
| QDropEvent | QEvent::Drop | 拖放操作完成,即放下拖动的对象 |
| QTouchEvent | QEvent::TouchBegin | 开始一个触屏事件序列(sequence) |
| QEvent::TouchCancel | 取消一个触屏事件序列 | |
| QEvent::TouchEnd | 结束一个触屏事件序列 | |
| QEvent::TouchUpdate | 触屏事件 | |
| QGestureEvent | QEvent::Gesture | 手势事件,能识别轻触、放大、扫屏等 |
| QNativeGestureEvent | QEvent::NativeGesture | 操作系统检测到手势而产生的事件 |
| QActionEvent | QEvent::ActionAdded | 运行 QWidget::addAction() 函数时会产生这种事件 |
| QEvent::ActionChanged | Action 改变时触发的事件 | |
| QEvent::ActionRemoved | 移除 Action 时触发的事件 |
事件处理
QObject中
- 接收事件
- event()处理,通过参数e可以获取具体的类型
他是一个虚函数,派生类可以重写它

QWidget中
- 子类QWidget重写了evet(),,并针对一些典型类型的事 件定义了相关函数
- 对于QWidget已经定义的典型事件,可以不实现evet(),只需要实现需要的的典型事件函数(减少了事件类型判断)
- 其他还是实现event(),判断事件类型,实现具体逻辑

QWidget 类中定义的典型事件的处理函数
| 事件处理函数名 | 对应的事件类型 | 参数 event 的类型 | 事件描述 |
|---|---|---|---|
| mouseDoubleClickEvent() | QEvent::MouseButtonDblClick | QMouseEvent | 鼠标双击 |
| mousePressEvent() | QEvent::MouseButtonPress | QMouseEvent | 鼠标按键按下,可以是左键或右键 |
| mouseReleaseEvent() | QEvent::MouseButtonRelease | QMouseEvent | 鼠标按键释放,可以是左键或右键 |
| mouseMoveEvent() | QEvent::MouseMove | QMouseEvent | 鼠标移动 |
| wheelEvent() | QEvent::Wheel | QWheelEvent | 鼠标滚轮滚动 |
| enterEvent() | QEvent::Enter | QEnterEvent | 鼠标光标进入组件或窗口边界范围内 |
| leaveEvent() | QEvent::Leave | QEvent | 鼠标光标离开组件或窗口边界范围 |
| keyPressEvent() | QEvent::KeyPress | QKeyEvent | 键盘按键按下 |
| keyReleaseEvent() | QEvent::KeyRelease | QKeyEvent | 键盘按键释放 |
| focusInEvent() | QEvent::FocusIn | QFocusEvent | 组件或窗口获得键盘的输入焦点 |
| focusOutEvent() | QEvent::FocusOut | QFocusEvent | 组件或窗口失去键盘的输入焦点 |
| showEvent() | QEvent::Show | QShowEvent | 窗口在屏幕上显示出来,或组件变得可见 |
| hideEvent() | QEvent::Hide | QHideEvent | 窗口在屏幕上隐藏(例如窗口最小化),或组件变得不可见 |
| moveEvent() | QEvent::Move | QMoveEvent | 组件或窗口的位置移动 |
| closeEvent() | QEvent::Close | QCloseEvent | 窗口被关闭,或组件被关闭 |
| paintEvent() | QEvent::Paint | QPaintEvent | 界面组件需要更新重绘 |
| resizeEvent() | QEvent::Resize | QResizeEvent | 窗口或组件改变大小 |
| dragEnterEvent() | QEvent::DragEnter | QDragEnterEvent | 在拖放操作中,鼠标光标移动到组件上方 |
| dragLeaveEvent() | QEvent::DragLeave | QDragLeaveEvent | 在拖放操作中,鼠标光标离开了组件 |
| dragMoveEvent() | QEvent::DragMove | QDragMoveEvent | 拖放操作正在移动过程中 |
| dropEvent() | QEvent::Drop | QDropEvent | 拖放操作完成,即放下拖动的对象 |
案例
事件直接处理
ui

code
效果


补充
也可以使用事件过滤器来实现(不推荐)
- 构造函数安装过滤器
- 重写过滤器方法