一、事件
前言
事件是QT的三大机制之一,一定程度上信号和槽也属于事件的一种
QT中的事件指哪些:窗口关闭,窗口显示,敲击键盘,点击鼠标左键、鼠标右键、鼠标滚轮,文件拖放等等
1、事件循环
QT中的所有事件,都是放在 "事件循环" 中,被反复执行的
本质上不是一次性的操作,而是这些事件,这些函数,被反复触发,反复执行,那么就会出现在事件循环中,被反复执行。
2、事件的本质
在QT中,所有的事件,本质上都是受保护的虚函数,发生了对应的事件,就会调用对应的受保护的函数。
所有事件函数中,都有一个事件对象,用来维护并记录事件发生的过程中所产生的数据,我们可以通过这个对象,获取事件过程中所产生的数据
void 事件(事件对象 ev){
我们可以通过 "事件对象" ev 来获取事件中的数据
}
3、关闭事件和隐藏事件
1)关闭事件
事件函数:
virtual void closeEvent(QCloseEvent* ev);
事件对象:
QCloseEvent* ev :关闭事件中基本不产生数据,所以没啥用
发生条件:
1.点击窗口的关闭键
2.手动调用函数close();关闭窗口
关闭事件的特点:
1.在关闭事件中,会先关闭窗口,再调用析构函数
2.只有将所有的窗口都隐藏或关闭时,并且最后一个事件时关闭事件时,才会调用析构函数,并且是调用所有关闭和隐藏了的窗口的析构函数
3.关闭事件是通过隐藏事件实现的
2)隐藏事件
事件函数:
virtual void hideEvent(QHideEvent* ev);
事件对象:
隐藏事件不产生数据,不需要调用
触发条件:
1.点击窗口的隐藏键
2.手动调用函数hide();隐藏窗口
隐藏事件的特点:
1.隐藏事件不会调用析构函数
2.如果操作的最后一个窗口触发的事件,是隐藏事件,则不论前面有没有关闭事件,都不会调用析构函数
3)关闭事件和隐藏事件的区别
无论是关闭事件还是隐藏事件,现象都是将窗口给隐藏
区别在于:
隐藏事件,无论如何都不会调用析构函数
关闭事件,会有条件的调用析构函数
4、键盘事件
1)键盘事件的槽函数
事件函数:
virtual void keyPressEvent(QKeyEvent* ev); //按下事件
virtual void keyReleaseEvent(QKeyEvent* ev); //释放事件
事件对象:
获取键盘上按下的按键的值以及功能
触发条件:
按下、释放键盘上的按键
2)如何获取键盘按下的按键值
QString QKeyEvent::text() const
功能:以字符串类型,返回键盘敲击的值
3)如何获取键盘按下的所有按键(包括功能按键)
int QKeyEvent::key() const
功能:可以获取键盘上按下的每一个按键,包括功能按键
返回值:是一个枚举,每个枚举值代表按下的不同按键
4)如何获取键盘按下的组合键
Qt::KeyboardModifiers modifiers() const
功能:返回按下的组合键,如果按下的不是组合键,就返回noModifier
5)键盘事件的重复触发机制
键盘的重复触发机制是指,如果按键按住,不抬起释放,就会重复触发键盘的 "按下" - "抬起" 事件,直到按键真正被释放。在键盘事件中有一个函数可以检测按键是否正在被按下,就是isAutoRepeat()
函数原型:
bool QKeyEvent::isAutoRepeat() const
功能:检查是否有按键正在被按下,如果有就返回True,如果没有就返回False
5、事件过滤器
QT当中事件的流转过程如下
1. 发生物理事件;
2. 发生事件的窗口捕获该事件;
3. 将该事件交给事件过滤器,经过各种过滤以后;
4. 派发给目标窗口;
当前鼠标焦点在哪个窗口,就会派发事件给哪个窗口
如果所有窗口都不具备焦点,则派发个事件发生的窗口
5. 接收到事件的窗口调用对应的事件函数。
1)label文本框
label对象,不会被事件过滤器派发事件
2)将ui界面中某个窗口的类型,修改成我们自己写的类型
3)手动将事件派发个目标窗口
4)