QT中的事件机制

目录

[1. 概念](#1. 概念)

[2. 事件处理](#2. 事件处理)

[2.1 demo1鼠标进入与离开事件](#2.1 demo1鼠标进入与离开事件)

[3. 鼠标事件处理](#3. 鼠标事件处理)

[3.1 demo1按下鼠标事件](#3.1 demo1按下鼠标事件)

[3.2 demo2释放鼠标和双击鼠标事件](#3.2 demo2释放鼠标和双击鼠标事件)

[3.3 demo3在Widget类中重写事件处理函数](#3.3 demo3在Widget类中重写事件处理函数)

[4. 键盘事件](#4. 键盘事件)

[5. 定时器事件](#5. 定时器事件)

[5.1 demo1使用QTimerEvent事件完成倒计时](#5.1 demo1使用QTimerEvent事件完成倒计时)


1. 概念

我们在之前的章节学习过信号槽机制,当用户执行某些操作的时候就会发出信号并关联到某些执行函数中.而事件也与之类似,也是有用户执行某些操作,然后会发出某些事件,再去处理相关的事件处理函数.

这二者看起来是挺相似的,其实本质上信号槽就是由事件机制进行进一步封装而产生的.当信号槽中现有的信号无法满足程序员的操作时,就可以使用事件机制进行拓展.

在我们开发过程中一班优先使用信号槽机制,只有在需要进行额外扩展的情况下才考虑使用事件.

所有的 Qt 事件均继承于抽象类 QEvent。常⻅的 Qt 事件如下:

常⻅事件描述:

⿏标事件 ⿏标左键、⿏标右键、⿏标滚轮,⿏标的移动,⿏标按键的按下和松开
键盘事件按键类型、按键按下、按键松开
定时器事件 定时时间到达
进⼊离开事件 ⿏标的进⼊和离开
滚轮事件⿏标滚轮滚动
绘屏事件 重绘屏幕的某些部分
显⽰隐藏事件窗⼝的显⽰和隐藏
移动事件 窗⼝位置的变化
窗⼝事件 是否为当前窗⼝
⼤⼩改变事件 窗⼝⼤⼩改变
焦点事件键盘焦点移动


2. 事件处理

QT中的事件处理其实是基于重写父类的虚函数来实现的.QWidget类中有大量的事件处理函数,在事件触发以后会自动调用这些函数,所以一个子控件如果需要修改某些事件处理机制就需要继承某个父类并重写相应的事件处理函数.

2.1 demo1鼠标进入与离开事件

1)创建一个子类

2)重写事件处理函数

3)创建一个重写以后的控件

在UI中只能创建QPushButton,但是可以对其类型进行提升为我们自定义的子类

4)执行程序


3. 鼠标事件处理

3.1 demo1按下鼠标事件

1)创建子类控件继承父类QLabel

2)重写mousePressEvent

3)父控件接受子控件信号并修改标签的文本内容

4)执行程序

3.2 demo2释放鼠标和双击鼠标事件

1)重写事件函数

2)父控件链接信号

3)执行程序

这里可以看到,鼠标的各个事件是可以共同触发的,不会相互影响.

3.3 demo3在Widget类中重写事件处理函数

1)重写mouseMoveEvent和wheelEvent

2)追踪鼠标位置

3)执行程序


4. 键盘事件

在前面我们使用过QShortCut来获取一个按键是否被按下.底层来说,这个QShortCut是由键盘事件QKeyEvent封装而来的,所以我们也可以使用键盘事件来获取某个按键是否按下了.

4.1 demo1获取键盘按键的按下

1)重写QKeyPressEvent和QKeyReleaseEvent

2)执行程序


5. 定时器事件

QT中的QTimer类是基于QTimerEvent事件封装的.

5.1 demo1使用QTimerEvent事件完成倒计时

1)创建并启动定时器

2)重写QTimerEvent函数

3)执行程序

相关推荐
AC赳赳老秦13 分钟前
OpenClaw+Power Apps 实战:自动生成 Power Apps 应用、连接 Excel 数据源
大数据·开发语言·python·serverless·excel·deepseek·openclaw
提笔了无痕15 分钟前
如何用Go实现整套RAG流程
开发语言·后端·golang
(Charon)17 分钟前
【C++ 面试高频基础:指针、引用、const、static、new/delete 总结】
java·开发语言
2601_961875241 小时前
法考考试时间安排及科目|时间表|资料已整理
开发语言·c#·inverted-index·suffix-tree·sstable·r-tree·lsm-tree
AI科技星1 小时前
数术工坊第八卷:算力革命
c语言·开发语言·网络·量子计算·agi
金色熊族1 小时前
QTransform使用心得(二)--仿射变换、非仿射变换、矩阵
qt·线性代数·矩阵
geovindu1 小时前
go: Generators Pattern
开发语言·后端·设计模式·golang·生成器模式
码云骑士2 小时前
13-列表append的底层真相(上)-listobject源码中的预分配策略
开发语言·python
.道阻且长.3 小时前
C++ string 操作指南:接口解析
java·c语言·开发语言·c++
蚰蜒螟3 小时前
Java 对象的内存密语:从字段偏移量计算到 Unsafe 访问的完整链路
java·开发语言