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)执行程序

相关推荐
tongluowan0072 分钟前
数据结构 Bitmap(位图)完整详解
开发语言·数据结构·bitmap
008爬虫实战录4 分钟前
【码上爬】 题十八:模拟大厂加密算法, 堆栈分析找加密点,扣自执行函数,jsdom补环境
开发语言·javascript·ecmascript
skywalk81636 分钟前
言知中文编程语言计划书 by WorkBuddy
开发语言·编程
NiceCloud喜云8 分钟前
AutoClaw 接入自定义 Anthropic 端点:让 Kanban 工作流跑在自己的模型路由上
java·开发语言·c++·人工智能·python·eclipse·batch
skywalk816315 分钟前
脚本 isMobile.js(移动设备检测库)的核心实现
开发语言·javascript·ecmascript
jieyucx25 分钟前
从基础语法到面向对象:Go语言如何实现封装、继承与多态?
开发语言·后端·golang
Hua-Jay33 分钟前
OpenCV联合C++/Qt 学习笔记(二十五)----加载深度神经网络模型及深度神经网络模型的使用
c++·笔记·qt·opencv·学习·计算机视觉·dnn
SuperArc199939 分钟前
jar包文件修改(java编译与反编译)
java·开发语言·后端·jar·反编译
计算机安禾1 小时前
【c++面向对象编程】第49篇:面向对象的单元测试:用GoogleTest测试类
开发语言·c++·单元测试
lly2024061 小时前
Python3 条件控制
开发语言