QT事件机制理解
事件和信号
从硬件层来看: 事件就是一种中断,
中断的产生形式:
1.用户操控硬件所产生的中断。
2.由系统自身所产生的中断,比如说定时器。
这种中断由系统内核
监控,由系统内核接收到中断并向CPU发出的执行请求
就叫信号
。所以说事件是信号产生的基础。
当Cpu接收到请求信号之后,对这个中断进行的响应叫做事件响应
。
在操作系统中,用户操控硬件时的中断由操作系统所监控,比如,当用户点击了一下鼠标时,此时鼠标就产生了一个中断,操作系统监控到这个中断,向CPU发出响应的请求(即一种信号),CPU按照自己的时间片对这个响应请求进行响应并进入相应的函数对这个鼠标点击事件进行处理的过程,叫做响应。当CPU进入事件处理函数后就可执行对点击事件的各种软件层的逻辑包括再发出不同的信号。
事件与信号与槽机制
事件是信号槽中信号产生的基础,而不是信号槽,信号槽解决的是两个不相关的控件中的通信问题。
事件是解决本控件对来自系统中信号的响应问题,两者不是一个概念。只能说信号槽的信号产生是由事件产生的。
QT里的事件
main.cpp
创建了一个QApplication
对象a,调用exec()
后,整个程序进入事件循环,由QApplication 对象a监控应用程序中所有控件所产生的事件
#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
简要描述QT事件处理机制:由exec执行的事件循环监听整个应用程序中所有控件的事件,当某个控件产生相关事件之后,QApplication 对象
就会执行 notify 函数,向此控件发送通知,收到事件通知的控件通过 过滤 以及 分发函数,到达事件处理函数,整个过程为响应函数。
QT底层维护的 事件处理机制 路径
并且QT事件处理函数都是虚函数,可以重写功能。
常用事件处理函数:
- 鼠标事件 QMouseEvent
- 键盘事件 QKeyEvent
- 重绘事件 QPaintEvent
- 定时器事件 QTimeEvent
- 拖拽事件 QDropEvent
再次区别事件机制、信号与槽机制
事件机制是针对于某一个控件,信号与槽机制针对两个不相关的控件
事件机制是CPU调度完成的,信号与槽机制是自动触发的,只要触发了信号,直接槽函数处理,不会等CPU