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


执⾏效果如下:

相关推荐
是摆烂第一名呀1 小时前
【rk3506】U-Boot串口时钟未配置,导致串口彻底失效
linux·arm开发·驱动开发·嵌入式硬件
chouchuang1 小时前
day-027-面向对象-下
开发语言·python
誰能久伴不乏1 小时前
C++11 随机数生成——告别 rand()
开发语言·c++
海清河晏1111 小时前
数据结构 | 二叉平衡搜索树
开发语言·数据结构·visual studio
kuonyuma1 小时前
java之动态代理
java·开发语言
KouFiee2 小时前
同名隐藏基础
开发语言·c++
子非鱼94272 小时前
10-Flutter调用鸿蒙原生能力前置课:MethodChannel和PlatformView准备
学习·flutter·华为·harmonyos
小L~~~2 小时前
MLIR学习笔记
笔记·学习·mlir
z落落2 小时前
C# Task WaitAll、WaitAny、WhenAll、WhenAny
开发语言·c#