Qt里的信号与槽原理

2023-11-03

一、什么是信号与槽机制?

  ​ 信号和槽(Signal & Slot)用于两个对象(object)进行交流,通俗地来说,就是一个对象发出什么信号,另一个对象执行相应的动作(比如跑步比赛中,裁判员发出枪响信号,运动员开始起跑)。

  信号(Signal):相当于发出一个事件通知。

  槽(Slot):槽其实是一个函数,为了响应信号而执行的一系列的指令。

  连接(connect):这个连接的过程,就是,我们指定什么样的信号执行什么样的槽函数。

  Qt里只有从QOBject派生来的类,才支持信号与槽。主要分为两类:1、Qt类自带的;2、用户自定义的。

二、信号

  对于Qt中自带的信号而言,一般只需要知道有哪些信号,直接去使用即可,Qt中常见的几个信号如下:

void clicked(bool checked = false)

void pressed()

void released()

void toggled(bool check)

  如果想要使用自定义的信号, 首先要编写新的类并且让其继承Qt的某些标准类,我们自己编写的类想要在Qt中使用使用信号槽机制, 那么必须要满足的如下条件:
     1. 这个类必须从QObject类或者是其子类进行派生
     2. 在定义类的头文件中加入 Q_OBJECT 宏
  要求:
     1. 信号是类的成员函数
     2. 返回值是 void 类型
     3. 信号的名字可以根据实际情况进行指定
     4. 参数可以随意指定, 信号也支持重载 void signal_test(int, int, char);
     5. 信号需要使用 signals 关键字进行声明, 使用方法类似于public等关键字
     6. 信号函数只需要声明
     7. 在程序中发送自定义信号: 发送信号的本质就是调用信号函数

  当我们写下一下emit signal代码的时候,与这个signal相连接的slot就会被调用,那么这个调用是如何发生的呢?让我们来逐一解开其中的谜团。

  来看一段例子代码:

class ZMytestObj : public QObject
{
Q_OBJECT
signals:
void sigMenuClicked();
void sigBtnClicked();
};

  编译器在做完预处理之后的代码如下:


// SIGNAL 0
void ZMytestObj::sigMenuClicked()
{
QMetaObject::activate(this, &staticMetaObject, 0, 0);
}
 
// SIGNAL 1
void ZMytestObj::sigBtnClicked()
{
QMetaObject::activate(this, &staticMetaObject, 1, 0);

所以信号函数也可以自己写成这样的方式去定义。

三、槽函数

  特点为:
      1.返回值void
      2.参数可以有,参数的类型和个数需要和对应的信号对应起来,参数个数可以比信号少,但不能多void slot_test(int);与前面的void signal_test(int, int, char)对应

四、连接信号槽

  connect函数

 //QT4
 connect(m_pPushBtn, SIGNAL(clicked(bool)), &signalTest, SLOT(slots_TestSlot1()));

 //QT5
 connect(m_pPushBtn, &QPushButton::clicked, &signalTest, &CSignalTest::slots_TestSlot1);

   注意:
      1.一个信号可以连接到多个槽函数
         信号触发之后,所有槽函数都被调用,调用顺序不确定

      2.一个槽函数,可以被多个信号连接
         其中某一个信号触发时,槽函数都将被调用

      3.connect可以连接信号与信号
         connect(m_pPushBtn, SIGNAL(clicked(bool)), &signalTest, SIGNAL(signals_TestSignls()));

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt里的信号与槽原理 的相关文章

随机推荐

  • jquery保留一位小数_青岛版数学,4年级上册,动物世界——小数意义和性质,干货分享...

    各位家长 同学们 大家好 这里是玖振学堂学习分享课堂 今天给大家分享的内容是青岛版数学四年级上册中动物世界 小数的意义和性质这一单元的知识点 小数的意义 仿照整数的写法 写在整数的右面 用圆点隔开 用来表示十分之几 百分之几 千分之几 的数
  • 程序员开发遇见chrome浏览器访问异常 ie 火狐正常访问 快速解决办法(80以上版本chrome有重大变化)

    近期有部分程序员开发遇见的chrome80以上版本url访问异常等 针对相同操作系统 相同浏览器 相同的url所展示的异常现象 网上找了很多方法尝试js调试 后台跨域等 然而并没有什么卵用 大家也别浪费时间测试了 本人尝试过以上所有方法 结
  • 实验六—基本数据管理(三)

    实验6 基本数据管理 三 实验目的 综合应用数据框的多种操作 进行综合实验 掌握小提琴图的绘制方法 实验内容 1 计算2的1 50次方 以及1 50的平方 找出这两个序列有哪些元素是相等的 显示出来 x lt NULL y lt NULL
  • 服务器被攻击的处理方法

    一 服务器被攻击怎么办 处理步骤 1 切断网络 所有的攻击都来自于网络 因此 在得知系统正遭受黑客的攻击后 首先要做的就是断开服务器的网络连接 这样除了能切断攻击源之外 也能保护服务器所在网络的其他主机 2 查找攻击源 可以通过分析系统日志
  • 基于人工蜂群算法优化最小二乘支持向量机lssvm实现数据回归预测附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 信号处理 图像
  • Yarn常用命令

    Yarn常用命令 文章目录 1 yarn application 查看任务 2 yarn logs 查看日志 3 yarn applicationattempt 查看尝试运行的任务 4 yarn container查看容器 5 yarn n
  • 无线打印机服务器说明书,无线打印机服务器

    无线打印机服务器 内容精选 换一换 假定某个Flink业务每秒就会收到1个消息记录 基于某些业务要求 开发的Flink应用程序实现功能 实时输出带有前缀的消息内容 Flink样例工程的数据存储在Kafka组件中 Flink向Kafka组件发
  • 生命在于学习——业务逻辑漏洞

    声明 只是用于学习交流 笔记记录 不可用作违规用途 一 业务逻辑漏洞简介 简单理解 就是编程人员的思维逻辑不够严谨导致攻击者有机可乘的漏洞 逻辑漏洞还是一种虽然没有在owasp top10中提及到 但是往往会存在的漏洞 并且在hvv 渗透测
  • 用户和组权限管理笔记

    一 管理用户和组 Linux 是一个多用户 多任务的服务器操作系统 1 Linux用户类型 linux用户和组账户概述 用户和组 系统上的每个进程 运行的程序 都是作为特定用户运行的 每个文件都是由一个特定用户拥有 访问文件和目录受到用户的
  • 疯壳-鸿蒙OS-应用程序监听驱动程序消息

    应用程序监听驱动程序消息 疯壳 出品 在前面课程中 我们通过驱动服务基类成员IDeviceIoService中的Dispatch方法进行用户态应用程序和内核态驱动程序的消息交互 其中涉及到两个HdfSBuf data与reply data
  • python的color函数的参数_Python 函数参数

    参数 我们用函数封装了一个功能 但是希望这个功能可以在不同要求的作用下面得到不同的结果 就需要用到参数 def f color if color green print They re green elif color yellow pri
  • 字符串转换,将前端传过来的json格式的数据转化为以“#”号隔开的格式的数据(replaceAll、substring和数组)

    一 字符串转换 将前端传过来的json格式的数据转化为以 号隔开的格式的数据 需求 在题目新增时 前端传过来的四个选项是json格式的数据 后端存入数据库的格式要求将四个选项以 隔开 例如 将 A 招标人 B 投标人 C 设计单位 D 施工
  • 一篇就够!数据增强方法综述

    作者 太子长琴 整理 NewBeeNLP 数据增强 Data Augmentation DA 缓解了深度学习中数据不足的场景 在图像领域首先得到广泛使用 进而延伸到 NLP 领域 并在许多任务上取得效果 一个主要的方向是增加训练数据的多样性
  • TorchVision Transforms API 大升级,支持目标检测、实例/语义分割及视频类任务

    内容导读 TorchVision Transforms API 扩展升级 现已支持目标检测 实例及语义分割以及视频类任务 新 API 尚处于测试阶段 开发者可以试用体验 本文首发自微信公众号 PyTorch 开发者社区 TorchVisio
  • JDK8的 stream流详解-转载

    本文章 转载自头条网 只是觉得好用很详细 所以自己收集 做下笔记 不做任何商业用途 不收任何费用 不喜勿喷 本文是转载 希望不要涉及到文章版权 只是自己做笔记 这个是最重要的 致敬 头条 程序猿的内心独白 1 Stream初体验 我们先来看
  • 11-1 输入输出流

    1 文件打开方式 打开方式通常有 r w a 三种 分别代表 只读 只写 附加 三种操作加 t 表示以文本文件形式打开 加 b 表示以二进制文件形式打开 什么都不加的情况下 默认打开文本文件 二进制文件和文本文件的区别 1 在 window
  • Mybatis多表模型

    多表模型 多表模型分类 一对一 在任意一方建立外键 关联对方的主键 一对多 在多的一方建立外键 关联一的一方的主键 多对多 借助中间表 中间表至少两个字段 分别关联两张表的主键 多表模型一对一操作 sql语句准备 CREATE TABLE
  • QGIS插件式开发(三)---插件开发

    本篇文章着重讲述插件开发的主要流程 揭开QGIS插件式开发的真面目 正所谓万事开头难 掌握了第一步 后面就可以把主要精力放在功能开发上 而不必再为怎么加载插件 init 函数的功能是什么等问题所困扰 一 自动创建 自动创建很简单 比较适合对
  • useMemo和useCallback的区别 及使用场景

    useMemo 和 useCallback 接收的参数都是一样 第一个参数为回调 第二个参数为要依赖的数据 共同作用 1 仅仅 依赖数据 发生变化 才会重新计算结果 也就是起到缓存的作用 两者区别 1 useMemo 计算结果是 retur
  • Qt里的信号与槽原理

    一 什么是信号与槽机制 信号和槽 Signal Slot 用于两个对象 object 进行交流 通俗地来说 就是一个对象发出什么信号 另一个对象执行相应的动作 比如跑步比赛中 裁判员发出枪响信号 运动员开始起跑 信号 Signal 相当于发