Qt消息模型

Qt消息模型

1. GUI 消息驱动事件模型

  • Qt 封装了具体操作系统的消息模型(跨平台)
  • Qt遵循经典GUI消息驱动事件模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在这里插入图片描述

GUI 消息驱动事件模型

图示解释:

  1. 用户操作(点击按钮)触发用户事件
  2. 操作系统接收用户事件
  3. 操作系统将用户事件翻译为应用程序消息
  4. 应用程序接收到消息
  5. 应用程序调用消息处理函数进行处理

2. 信号与槽

2.1 问题
  • Qt 如何表示用户消息?

  • Qt 如何将用户消息映射到消息处理函数?

  • Qt 消息映射遵循什么规则?

2.2 Qt的解决方案
  • Qt 中定义了与系统消息相关的概念

    • 信号(Signal)

      • 由操作系统产生的消息
    • 槽(Slot)

      • 程序中的消息处理函数
    • 连接(Connect)

      • 将系统消息绑定到消息处理函数
  • Qt中的消息处理机制

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    在这里插入图片描述
    *** 信号与槽的连接必须发生在2个Qt类对象之间

图示解释:

  1. 对象1 产生一个消息,经操作系统翻译后发送信号
  2. connect连接信号与消息处理函数
  3. 触发消息处理函数即可实现某种操作
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…
      1. 检查类是否继承于 QObject
      2. 检查类声明的开始处是否添加 Q_OBJECT
      3. 检查是否使用slots 关键字进行槽声明
      4. 检查槽的名称是否拼写错误
      5. 重新执行qmake

小总结:

  • 信号与槽式Qt中的核心机制
  • 不同的Qt对象可以通过信号与槽进行通信
  • 只有QObject 的子类才可以自定义信号与槽
  • 使用信号与槽的类必须在声明的最开始处使用Q_OBJECT
  • 信号与处理函数在函数签名上必须一致

小贴士:

  • C++中的函数签名(function signature)
    • 包含了一个函数的信息:
      • 函数名
      • 参数类型
      • 参数个数
      • 参数顺序
      • 函数所在的类和命名空间
    • 普通函数签名不包含函数返回值部分
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来鸟 鸣间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值