QT中的事件及其属性

Qt中的事件是对操作系统提供的事件机制进行封装,Qt中的信号槽就是对事件机制的进一步封装

但是特殊情况下,如对于没有提供信号的用户操作,就需要通过重写事件处理的形式,来手动处理事件的响应逻辑

常见的Qt事件:

常见事件描述

|--------|---------------------------------|
| 事件名称 | 描述 |
| 鼠标事件 | 鼠标左键、鼠标右键、鼠标滚轮,鼠标的移动,鼠标按键的按下和松开 |
| 键盘事件 | 按键类型、按键按下、按键松开 |
| 定时器事件 | 定时时间到达 |
| 进入离开事件 | 鼠标的进入和离开 |
| 滚轮事件 | 鼠标滚轮滚动 |
| 绘屏事件 | 重绘屏幕的某些部分 |
| 显示隐藏事件 | 窗口的显示和隐藏 |
| 移动事件 | 窗口位置的变化 |
| 窗口事件 | 是否为当前窗口 |
| 大小改变事件 | 窗口大小改变 |
| 焦点事件 | 键盘焦点移动 |

使用QEvent来表示事件的概念,使用其子类表示具体操作产生的事件

自定义事件处理的方式:

让当前的类,重写具体事件的处理函数----用的是C++的多态机制

创建的子类继承自Qt已有的类,在子类中重写父类的事件处理函数,后续触发事件时,通过多态机制,执行子类重写的处理函数

例:

重写鼠标进入enterEvent和鼠标离开leaveEvent的事件

在ui界面创建一个pushbutton,当鼠标离开,进入时进行debug输出

通过创建一个QPushButton的子类---新建文件为c++类,在子类中重写两个事件的处理函数

在pushbutton.h引入头文件,修改构造函数的声明,使其在构造时能指定父类

在pushbutton.cpp实现构造函数指定父类

在pushbutton.h声明要重写的事件处理函数,要想重写父类的函数,需要保证函数名和函数的参数列表与父类的完全一致

在pushbutton.cpp文件实现处理函数重写

但是此时无法触发重写函数,因为在ui界面创建的按钮是QPushButton,而不是重写的pushbutton

通过在ui界面右键点击pushbutton,点击提升为

成功提升后,对象树中控件的名字就会发生改变

此时,鼠标离开和进入事件的处理函数就成功被自定义

鼠标按下事件

mousePressEvent()

通过事件获取并打印鼠标的位置

在ui界面创建一个label,并将farmeshape设置为box

在新建一个c++class文件,继承自QLabel

修改头文件和cpp文件中的构造函数,使接收父类指针

在再ui界面,将QLabel提升为label

在label.h头文件声明重写事件处理函数mousePressEvent

在label.cpp文件进行重写,实现触发label的鼠标点击事件后,输出鼠标位置

还需将头文件导图mainwindow.cpp中

此时就可以通过自定义的事件处理函数来实现点击label输出鼠标位置

不仅左键能触发,右键或其它标准鼠标按键都能触发mousePressEvent事件

可以设置为仅将左键触发的事件进行输出

鼠标释放事件

鼠标释放事件是mouseReleseEvent()

在上面的label继续进行虚函数重写

头文件进行虚函数声明

源文件进行重写

鼠标双击事件

mouseDoubleClickEvent()

同样在label进行虚函数声明与重写

鼠标移动事件

mouseMoveEvent()

直接在新建的MainWindow文件的mainwindow类进行重写,是鼠标在整个窗口的动作都能被获取到

声明

重写

运行后,开始时无输出

因为鼠标移动事件,随便移动一下鼠标就会产生大量的鼠标移动的事件,当进行事件捕获时,会有大量鼠标移动事件需要处理,容易造成程序卡顿

Qt为了保证程序的流畅性,默认情况下不会对鼠标移动进行追踪,鼠标移动时不会调用mouseMoveEvent,除非显示告诉Qt需要追踪鼠标位置

方法:

在构造函数调用setMouseTracking(),将是否追踪鼠标位置设为true,才能追踪鼠标的移动位置

鼠标滚轮的滚动事件

wheelEvent()

例:

新建文件继承自QWidget

进行虚函数声明与重写

按键事件

Qt中的按键事件是通过QKeyEvent类来实现的,当键盘上的按键被按下或者被释放时,键盘事件便会触发

Qt中封装了按键事件----QShortCut类

通过QShortCut定义一个快捷键,指定按键后,按下对应按键发出对应信号,通过定义信号的槽函数来实现对应操作

通过事件直接获取用户按下键盘的操作

keyPressEvent(QKeyEvent* )

QKeyEvent

例:

创建一个继承自QWidget的文件

进行虚函数的声明和重定义

按下a,b,c后打印65,66,67,因为Qt中将键盘的所有按键进行枚举

通过对key值进行判断可以获取指定按键是否被按下,如获取a键

对于组合键,如:ctl+a如何进行获取?

同样可以通过key值利用modifiers---同时按下了什么键,来进行获取

定时器事件

Qt中在进行窗口程序的处理过程中,经常要周期性的执行某些操作,可以通过定时器进行实现。

定时器就是在时间间隔一定时间后,去执行某一共任务。

Qt中的定时器分为QTimerEvent和QTimer俩个类

QTimerEvent

QTimerEvent类用来描述一个定时器事件。在使用时需要通过startTimer()函数来开启一个定时器,这个函数需要输入一个以毫秒为单位的整数作为参数来表明设定的时间,它返回的整形值代表这个定时器。当定时时间到达时,就可以在timerEvent()函数中获取该定时器的编号来进行相关操作。

例:

创建一个继承自QWidget的文件

实现简单的倒计时功能

在ui界面创建一个LcdNumber

将其初始值设为10

在头文件声明一个int timerid用来接收定时器编号

在构造函数开启定时器事件,接收timerid

对timerEvent进行虚函数的声明与重写

QTimer类来实现一个定时器---由QTimerEvent封装而来,提供更高层次的编程接口,如:可以使用信号和槽,还可以设定只运行一次的定时器

窗口事件

moveEvent()窗口移动时触发的事件

resizeEvent()窗口大小改变时触发的事件

例:

创建一个继承自QWidget的文件

对两个虚函数进行声明与重写

相关推荐
菩提树下的凡夫6 分钟前
Qt环境下普通变量与原子变量的区别与联系
qt
xyq20247 分钟前
Memcached stats items 命令详解
开发语言
Evand J9 分钟前
【MATLAB例程】多传感器协同DOA目标跟踪与EKF滤波,输出动态目标轨迹、轨迹误差对比分析
开发语言·matlab·目标跟踪·滤波·定位·导航
csbysj20209 分钟前
《jEasyUI 自定义分页》
开发语言
初心未改HD11 分钟前
Go语言Context深度解析与工程实践
开发语言·golang
SilentSamsara15 分钟前
Python 内存管理:引用计数、循环垃圾回收与内存泄漏排查
开发语言·vscode·python·青少年编程·pycharm
傻啦嘿哟2 小时前
如何在 Python 中使用 colorama 库来给输出添加颜色
开发语言·python
geovindu3 小时前
go: Visitor Pattern
开发语言·设计模式·golang·访问者模式
宣宣猪的小花园.3 小时前
C语言重难点全解析:内存管理到位运算
c语言·开发语言·单片机
方安乐7 小时前
python之向量、向量和、向量点积
开发语言·python·numpy