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

相关推荐
a努力。2 小时前
阿里Java面试被问:WebSocket的心跳检测和自动重连实现
java·开发语言·python·websocket·面试·职场和发展·哈希算法
行秋2 小时前
MATLAB 中的两大电力仿真库:Simscape Electrical(蓝色库) vs SimPowerSystems(黑色库)
开发语言·matlab
涛起云永2 小时前
Qt 源码编译 -- obj文件无法找到
开发语言·qt
hzb666662 小时前
xd_day28js原生开发-day31 day41asp.net
开发语言·前端·javascript·安全·web安全
Remember_9932 小时前
【数据结构】Java数据结构深度解析:栈(Stack)与队列(Queue)完全指南
java·开发语言·数据结构·算法·spring·leetcode·maven
小李子呢02112 小时前
Node.js
开发语言·前端·学习·node.js
鱼很腾apoc2 小时前
【实战篇】 第13期 算法竞赛_数据结构超详解(上)
c语言·开发语言·数据结构·学习·算法·青少年编程
期待のcode2 小时前
JVM 中对象进入老年代的时机
java·开发语言·jvm
毕设源码-赖学姐2 小时前
【开题答辩全过程】以 基于java的医院床位管理系统的设计与开发 为例,包含答辩的问题和答案
java·开发语言