QT(事件)

发布于:2025-08-16 ⋅ 阅读:(17) ⋅ 点赞:(0)

一、事件

前言

事件是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)

6、鼠标事件

1)鼠标左键事件

2)鼠标右键事件

(1)向右键菜单栏中添加选项

7、拖放事件

1)拖放事件的触发

2)拖入事件的代码

3)释放事件的触发

4)释放事件的代码


网站公告

今日签到

点亮在社区的每一天
去签到