消息处理模型
- GUI程序必须依赖操作系统运行
- GUI应用程序提供的功能必须由用户来触发
- 消息的产生一般是通过用户对应用程序进行了某种操作(如点击某个按钮),随之操作系统捕捉到这个操作,并让系统内核将这个操作事件转换成一个系统消息然后发送给应用程序,最后应用程序收到这个系统消息后就会调用相应的消息处理函数对这个用户操作进行最终的处理。
系统内核会将系统消息发送给应用程序,那么在Qt应用程序中系统内核是如何将发送的系统消息转换成Qt信号?
答案是通过事件处理来将系统消息转变成Qt信号
Qt中的事件处理
- Qt平台将系统产生的消息转换成Qt事件
- Qt事件是一个QEvent对象
- Qt事件用于描述程序内部或外部发生的动作,这意味着QEvent对象用来描述操作系统发送回的消息
- 一个系统消息对应着一个Qt事件,也就是一个QEvent对象
- Qt的一个事件需要一个QObject对象来处理,并且任意的QObject对象都具备事件处理的能力
- Qt事件相关类的继承关系图:
Qt事件处理方式
- Qt事件产生后立即被分发到QWidget对象,比如点击一个按钮后就会将点击按钮这个事件发送到对应的QWidget对象上(或是一个窗口,或是一个对话框)
- 然后这个QWidget对象调用event()这个事件处理函数,因此,event()函数也是事件处理的入口
- event()根据事件类型(由于操作系统发送的消息类型是各不相同的,且操作系统的消息和Qt事件是一一对应的,所以Qt事件对应的事件处理函数(event()函数的子函数)也是各不相同,所以需要在event()函数中判断对应的事件类型)调用不同的事件处理函数。
- 在事件处理函数中发送Qt中预定义的信号,最后调用信号关联的槽函数。
场景分析:按钮点击
1、首先用户点击某个功能按钮
2、操作系统感知到后会产生一个系统消息
3、系统内核会将点击按钮这个消