事件
发表于:2024-12-26 | 分类: qt
字数统计: 1.3k | 阅读时长: 4分钟 | 阅读量:

事件

问题

窗口上有一个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

效果

移动

双击窗口

补充

也可以使用事件过滤器来实现(不推荐)

  • 构造函数安装过滤器
  • 重写过滤器方法
上一篇:
信号和事件
下一篇:
信号与槽