news 2026/7/13 5:46:09

【Qt系统相关】鼠标事件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Qt系统相关】鼠标事件

目录

一、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
其中返回值代表滚轮滑动的距离。正数表⽰滚轮相对于⽤⼾向前滑动,负数表⽰滚轮相对于⽤⼾向后滑动。
⽰例:

执⾏效果如下:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 5:40:00

Unity动画状态机实战:根治滑步、硬切与穿模的流畅切换方案

1. 项目概述:为什么你的游戏动画总感觉“不对劲”?干了八年Unity,经手过几十个项目,我发现一个特别普遍的现象:很多开发者,尤其是刚入行的朋友,能把角色模型做得漂漂亮亮,动画资源也…

作者头像 李华
网站建设 2026/7/13 5:39:53

告别激活烦恼!5分钟教会你用KMS智能激活工具搞定Windows和Office

告别激活烦恼!5分钟教会你用KMS智能激活工具搞定Windows和Office 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是不是经常被Windows系统弹出的激活提醒搞得很烦?或者…

作者头像 李华
网站建设 2026/7/13 5:35:42

C++ vector内存管理:边读边释放的三种核心方案与实战

1. 项目概述:为什么需要“边读边释放”?在C开发中,尤其是处理海量数据流、日志分析或网络数据包解析的场景里,我们经常会遇到一个经典的内存管理难题:数据源源不断地读入一个std::vector,但这个容器的内存只…

作者头像 李华
网站建设 2026/7/13 5:31:03

Qt 5.14.2 程序部署报错:3种环境变量与目录拷贝方案实测对比

Qt 5.14.2 程序部署报错:3种环境变量与目录拷贝方案实测对比当你在Windows环境下部署Qt 5.14.2应用程序时,是否遇到过这样的报错信息:"This application failed to start because no Qt platform plugin could be initialized"&…

作者头像 李华
网站建设 2026/7/13 5:27:56

如何5分钟掌握Translumo:终极实时屏幕翻译工具完全指南

如何5分钟掌握Translumo:终极实时屏幕翻译工具完全指南 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo 还在为…

作者头像 李华