Qt 第38课、Qt 中的事件处理(上)

1、GUI程序原理回顾

  • 图形界面应用程序的消息处理模型
    特点:基于操作系统 ;由用户触发
    Qt 第38课、Qt 中的事件处理(上)

思考:操作系统发送的消息如何转变成 Qt 信号?

2、Qt 中的事件处理

  • Qt 平台将系统产生的消息转换成 Qt 事件
    — Qt 事件是一个QEvent的对象
    — Qt 事件用于描述程序内部或外部发生的动作
    — 任意的 QObject 对象都具备事件处理的能力
    Qt 第38课、Qt 中的事件处理(上)

当Qt 的GUI 应用程序被用户操作的时候,就会产生一个系统的消息,那么这个系统消息就会被发送到 Qt 应用程序上去,Qt 应用程序接收到这个消息之后呢,就会产生一个 Qt 事件。

  • GUI应用程序的事件处理方式
    1、Qt 事件产生后立即被分发到 QWidget 对象(比如按钮对象)
    2、QWidget中的event(QEvent*)进行事件处理
    3、event() 根据事件类型调用不同的事件处理函数
    4、在事件处理函数中发送 Qt 中预定义的信号
    5、调用信号关联的槽函数

场景分析:按钮点击(图中的4和5应该换个位置)
Qt 第38课、Qt 中的事件处理(上)

  • QPushButton事件处理分析
    1、接收到鼠标事件
    2、调用event(QEvent*)成员函数
    3、调用mouseReleaseEvent(QMouseEvent*)成员函数
    4、调用click()成员函数
    5、触发信号SIGNAL(clicked())

首先,用户点击按钮,然后该行为被操作系统感知到。然后,操作系统将该系统消息发送给 Qt 编写的应用程序。接着,该应用程序将系统消息转换成 Qt 事件,然后将该 Qt 事件分发给对应的界面组件即按钮。然后,在按钮类的 event() 函数中调用事件处理函数click,在click事件处理函数中发射clicked信号。信号发出后,如果有写相应的槽函数并连接到信号了,那么该槽函数就会被调用。

  • 事件(QEvent)和信号(SIGNAL)的不同:
    1、事件由具体对象进行处理,而信号是由对象在进行事件处理的过程中主动产生的。
    2、改写事件处理函数可能导致程序行为发生改变,但是信号是否存在对应的槽函数不会改变程序行为。
    3、一般而言,信号在具体的事件处理函数中产生。