Qt消息模型
1. GUI 消息驱动事件模型
- Qt 封装了具体操作系统的消息模型(跨平台)
- Qt遵循经典GUI消息驱动事件模型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
图示解释:
- 用户操作(点击按钮)触发用户事件
- 操作系统接收用户事件
- 操作系统将用户事件翻译为应用程序消息
- 应用程序接收到消息
- 应用程序调用消息处理函数进行处理
2. 信号与槽
2.1 问题
-
Qt 如何表示用户消息?
-
Qt 如何将用户消息映射到消息处理函数?
-
Qt 消息映射遵循什么规则?
2.2 Qt的解决方案
-
Qt 中定义了与系统消息相关的概念
-
信号(Signal)
- 由操作系统产生的消息
-
槽(Slot)
- 程序中的消息处理函数
-
连接(Connect)
- 将系统消息绑定到消息处理函数
-
-
Qt中的消息处理机制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
*** 信号与槽的连接必须发生在2个Qt类对象之间
图示解释:
- 对象1 产生一个消息,经操作系统翻译后发送信号
- connect连接信号与消息处理函数
- 触发消息处理函数即可实现某种操作
Qt的核心 ——QObject::connect 函数
bool connect(const QObject* sender, //发送对象
const char* signal, //消息名称
const QObject* receiver, //接收对象
const char* method, //接收对象的成员函数,消息处理函数
Qt::ConnectionType type = Qt::AutoConnection
);
Note:
- 在Qt中,消息用字符串描述
- connect 函数在消息名和消息处理函数之间 建立映射
Qt 的"新"关键字
—SIGNAL
- 用于指定消息名
—SLOT
- 用于指定消息处理函数名
—Q_OBJECT
- 所以自定义槽的类必须在类声明的开始处加上 Q_OBJECT
—slots
- 用于在类中声明消息处理函数
自定义槽
Note:
- 只有QObject 的子类才能自定义槽
- 定义槽的类必须在声明的开始处使用Q_OBJECT
- 类中声明槽时需要使用 slots 关键字
- 槽与所处理的信号在函数签名上必须一致
- SIGNAL 和 SLOT 所指定的名称中:
- 可以包含参数类型
- 不能包含具体的参数名
小贴士:
- 提示错误:Object::connect: No such slot…
-
- 检查类是否继承于 QObject
- 检查类声明的开始处是否添加 Q_OBJECT
- 检查是否使用slots 关键字进行槽声明
- 检查槽的名称是否拼写错误
- 重新执行qmake
-
小总结:
- 信号与槽式Qt中的核心机制
- 不同的Qt对象可以通过信号与槽进行通信
- 只有QObject 的子类才可以自定义信号与槽
- 使用信号与槽的类必须在声明的最开始处使用Q_OBJECT
- 信号与处理函数在函数签名上必须一致
小贴士:
- C++中的函数签名(function signature)
- 包含了一个函数的信息:
- 函数名
- 参数类型
- 参数个数
- 参数顺序
- 函数所在的类和命名空间
- 普通函数签名不包含函数返回值部分
- 包含了一个函数的信息: