1. GUI 程序原理回顾
- 图形界面应用程序的消息处理模型
- 那么操作系统发送的消息如何转变为 QT 信号?
2. QT 中的事件处理
-
QT 平台将系统产生的消息转换为 QT 事件
-
QT 事件是一个 QEvent 的对象
-
QT 事件用于描述程序内部或外部发生的动作
-
任意的 QObject 对象都具有事件处理的能力
-
-
GUI 应用程序的事件处理方式
- QT 事件产生后立即被分发到 QWidget 对象
- QWidget 中的 event(QEvent*) 进行事件处理
- event() 根据事件类型调用不同的事件处理函数
- 在事件处理函数中发送 QT 预定义的信号
- 调用信号关联的槽函数
-
事件( QEvent ) 和信号 ( SIGNAL )不同
- 事件由具体对象进行处理
- 信号由具体对象主动产生
- 改写事件处理函数可能导致程序行为发生改变
- 信号是否存在对应的槽函数不会改变程序行为
- 一般而言,信号在具体的事件处理函数中产生
3. 按钮点击场景分析
-
QPushButton 事件处理分析
- 接收鼠标事件
- 调用 event(QEvent*) 成员函数
- 调用 mouseReleaseEvent(QMouseEvent*) 成员函数
- 调用 click() 成员函数
- 触发信号 SIGNAL(clicked())
-
NotePad 项目中存在bug,当我们点击关闭按钮之后,NotePad会直接关闭而不会提示我们是否保存数据,这样是不友好的
-
文本编辑器中的关闭操作
4. 总结
- QT 中的事件 ( QEvent ) 和信号 ( SIGNAL ) 不同
- 事件由 QObject 的对象进行处理
- 信号由 QObject 对象触发
- 重写事件处理函数可能会改变程序行为
- 信号的触发不会对程序行为造成影响
- 事件处理是在实际工程开发中的应用非常普遍