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

相关推荐
浪子明X19 分钟前
十六位账本怎样发现传输差错:Internet Checksum 生活类比
开发语言
Quz2 小时前
QML StackView:实现卡片堆叠效果
qt
Quz2 小时前
QML Drawer 抽屉导航详解
qt
xiangyun613 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun613 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
白远山5 小时前
家政服务家政社区派单实战:调度系统架构设计与实现指南
java·开发语言·小程序·架构·需求分析
DevRay5 小时前
Java 21虚拟线程深度实战:告别线程池焦虑,百万并发吞吐量直接翻倍(原理+代码+避坑)
java·开发语言
free-elcmacom6 小时前
C++学习<1>程序分区
开发语言·c++
醉颜凉6 小时前
Java 必看:如何彻底避免 HashMap 多线程死循环问题?
java·开发语言
默 语6 小时前
Java新手入门:从零开始安装JDK并配置环境变量
java·开发语言·python·mysql·group by·1024程序员节·数据去重