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的文件

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

相关推荐
爱吃烤鸡翅的酸菜鱼1 小时前
【SpringMVC】概念引入与连接
java·开发语言·mysql
小白学大数据1 小时前
Python自动化解决滑块验证码的最佳实践
开发语言·python·自动化
碎梦归途1 小时前
23种设计模式-行为型模式之策略模式(Java版本)
java·开发语言·jvm·设计模式·策略模式·行为型模式
Albert Edison1 小时前
Python入门基础
开发语言·python
小余吃大鱼1 小时前
OpenStack私有云详细介绍
开发语言·php·openstack
画个大饼1 小时前
Swift:什么是Optional?其背后的机制是什么?什么是Unconditional Unwrapping?
开发语言·ios·swift
T0uken1 小时前
【Python】Matplotlib:立体永生花绘制
开发语言·python·matplotlib
sniper_fandc1 小时前
JVM(Java虚拟机)详解
java·开发语言·jvm
雾削木1 小时前
mAh 与 Wh:电量单位的深度解析
开发语言·c++·单片机·嵌入式硬件·算法·电脑
__lost1 小时前
小球在摆线上下落的物理过程MATLAB代码
开发语言·算法·matlab