【Qt系统相关】鼠标事件

目录

一、Qt事件

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


执⾏效果如下:

相关推荐
维吉斯蔡5 小时前
【VS Code / Cursor】文件夹右键快捷打开与文件类型自动关联
开发语言·程序人生·学习方法
乌萨奇也要立志学C++6 小时前
【Linux】网络基础 从零理解网络通信:局域网、跨网传输与 Socket 预备知识
linux·服务器·网络
暗影凋落7 小时前
CMake构建学习笔记-SQLite库的构建
笔记·学习·sqlite
luj_17687 小时前
星火科技助力边远地区防病攻坚
c语言·开发语言·c++·经验分享·算法
always_TT8 小时前
【Python 日志记录:logging 模块入门】
开发语言·python·php
RisunJan8 小时前
Linux命令-slabtop(实时显示内核 slab 缓存信息)
linux
画面无声8 小时前
STM32的SPI通信原理与练习记录
c语言·stm32·单片机·嵌入式硬件·学习
xcLeigh8 小时前
Go入门:变量声明的五种方式详解
java·开发语言·golang
zmzb01038 小时前
C++课后习题训练记录Day175
开发语言·c++
你有哈莫吗9 小时前
CMake构建学习笔记-iconv库的构建
笔记·学习