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

相关推荐
blasit21 小时前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
郑州光合科技余经理6 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1236 天前
matlab画图工具
开发语言·matlab
dustcell.6 天前
haproxy七层代理
java·开发语言·前端
norlan_jame6 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone6 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ4022054966 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
遥遥江上月6 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js
m0_531237176 天前
C语言-数组练习进阶
c语言·开发语言·算法
Railshiqian6 天前
给android源码下的模拟器添加两个后排屏的修改
android·开发语言·javascript