Qt信号与槽机制——新手友好

news2024/9/25 1:25:37

目录

一 为什么会有这个机制

二 信号与槽是什么

三 信号

四 槽

五 使用

1 最简单的

 2 函数指针

3 用Lambda表达式实现


 

 

一 为什么会有这个机制

我们平时的一个网页,如果点击网页上不同的部分会有不同的相应动作。比如点击超链接就会实现网页的跳转,比如点击右上角的×就会退出关闭窗口。如果一个按钮被孤立的创建出来没有功能的话,是没有意义的。其实通过这个机制也让类之间进行交流,实现了交互。

以上是我自己的理解,但是最重要的应该是实现了松散耦合。也就是说两个类是独立的,稳定的。但是可以通过connect建立类之间的关系。不需要这个联系了也可以直接拆散,并不会对之前的类造成什么影响

二 信号与槽是什么

举一个生活中的例子,这个相当于对外界的信号做出的反映。比如比如我叫了你的名字,你回头看我。

可以这样理解:这个事件是发生在对象之间的,最简单的就是两个对象之间。那么就从两个对象入手。

两个对象:我和你

动作:我叫你,你回头。我叫你相当于我给你发的一个信号(一般生活中有事情或者打招呼的时候会叫别人),你回头(是因为我叫你这个信号导致的反应)。

当然一个信号可以和多个槽函数连接,也就是相当于你对我的这个信号可能会有多种不同的响应。

 

三 信号

这里从老师饿了,发出信号,学生请客吃饭这个案例入手

在类中signals:标识的函数就是信号

1 返回值是void

2 参数可以是0个也可以是多个(个数),但是无论是多少个参数的类型都要和槽匹配

3 没有实现 

4 可以重载

四 槽

同理,用slots:标识的就是槽函数,也可以不表示写在public下。

 

1 返回值是void

2 参数要和signal匹配 可以是0个或者多个 

3 有实现

4 可以重载

五 使用

了解了信号和槽是什么,为什么有信号和槽机制之后,我们来了解一下该如何使用这个机制:

连接+emit

信号需要和槽进行链接,使用connect函数 

 这个函数有四个参数,分别标识对象和信号+槽。第一个位置表示发出信号的对象,第二个位置是信号,第三个位置是接受信号的对象,第四个位置是槽函数。

根据之前的二也很好理解为什么会有四个参数

设置了连接之后还要进行emit才能成功被调用

1 最简单的

这个是没有其他的信号函数和槽函数,在teacher和student中都只有一个。

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->s=new Student;//创建student和teacher的对象
    this->t=new Teacher;
    connect(t,&Teacher::hungry,s,&Student::treat);
    ClassOver();
}
void Widget::ClassOver()
{
    emit t->hungry();
}

 2 函数指针

如果我们进行了重载,可以用函数指针的方式定义信号。因为如果不指定的话就无法确定是调用哪个

   void(Student::*sSlot)(QString)=&Student::treat;
   void(Teacher::*tSignal)(QString)=&Teacher::hungry;
   connect(t,tSignal,s,sSlot);

老版本的Qt是这样连接的

connect(t,SIGNAL(hungry()),s,SLOT(treat()));

 这样就导致了重载的时候不知道去调用哪个的问题

3 用Lambda表达式实现

connect(b,&QPushButton::clicked,[=](){emit t->hungry("hot pot!");});

第三个参数如果是this的话,可以省略直接写成这样子的

其他

信号可以连接信号

 //信号连接信号
    void(Student::*sSlot)(QString)=&Student::treat;
    void(Teacher::*tSignal)(QString)=&Teacher::hungry;
    QPushButton* b=new QPushButton("treat me!",this);
    connect(t,tSignal,s,sSlot);
    connect(b,&QPushButton::clicked,t,tSignal);

一个信号可以连接多个槽函数,多个信号也可以连接同一个槽函数

用disconnect就可以断开连接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/382597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Code Virtualizer 3.1.4 Crack

Code Virtualizer 是一个强大的 Windows 应用程序代码混淆系统,它可以帮助开发人员保护他们的敏感代码区域免受逆向工程的影响,基于代码虚拟化的非常强大的混淆代码。 Code Virtualizer 会将您的原始代码(Intel x86/x64 指令)转换…

剑指 Offer day3, day4

剑指 Offer day3, day4 字符串和数组的操作。 剑指 Offer 05. 替换空格 剑指 Offer 05. 替换空格 - 力扣(Leetcode) 方法二:原地修改 在 C 语言中, string 被设计成「可变」的类型(参考资料)&#xff…

python海龟绘图

一、基础 (一)介绍 海龟绘图(Turtle Graphics):“小海龟”turtle是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始…

Git分支的合并策略有哪些?Merge和Rebase有什么区别?关于Merge和Rebase的使用建议

Git分支的合并策略有哪些?Merge和Rebase有什么区别?关于Merge和Rebase的使用建议1. 关于Git的一些基本原理1.1 Git的工作流程原理2. Git的分支合并方式浅析2.1 分支是什么2.2 分支的合并策略2.2.1 Three-way-merge(三向合并原理)2…

前端已死?我看未必,但「低代码」已剑指前端程序员

本文笔者会从以下几个方面分享,希望能够帮助正在迷茫的前端小伙伴提供一点思路! 逛技术博客 不局限框架 全栈工程师兴起 关注前沿 写技术文章 录制前端视频 总结 2023第一季度快过去了,没工作的找到工作了吗?有工作的加薪了…

Hbase的基本概念与架构

一、Hbase的概念 HBase是Hadoop的生态系统,是建立在Hadoop文件系统(HDFS)之上的分布式、面向列的数据库,通过利用Hadoop的文件系统提供容错能力。如果你需要进行实时读写或者随机访问大规模的数据集的时候,请考虑使用H…

Canal数据同步配置

文章目录Canal数据同步配置0.canal工作原理1.**检查binlog功能是否有开启**2.如果显示状态为OFF表示该功能未开启,开启binlog功能3.**在mysql里面添加以下的相关用户和权限**4.下载安装Canal服务5.修改配置文件6.进入bin目录下启动7.idea中配置Canal数据同步配置 c…

记录第一次接口上线过程

新入职一家公司后,前三天一直在学习公司内部各种制度文化以及考试。 一直到第三天组长突然叫我过去,给了一个需求的思维导图,按照这个需求写这样一个接口, 其实还不错,不用自己去分析需求,按照这上面直接开…

工业机器人有哪些类型?如何利用工业网关集中监测管理?

工业机器人在制造业中的应用与日俱增,使用工业机器人,不仅提高了设备和场地的利用率,还能保持稳定的产品水平。随着工业机器人的大规模部署,对于数量众多、类型各异、功能不一的机器人的监测、管理和维护,也成为企业面…

Java 异常

文章目录1. 异常概述2. JVM 的默认处理方案3. 异常处理之 try...catch4. Throwable 的成员方法5. 编译异常和运行异常的区别6. 异常处理之 throws7. 自定义异常8. throws 和 throw 的区别1. 异常概述 异常就是程序出现了不正常的情况。 ① Error:严重问题&#xff…

Nessus: 漏洞扫描器-网络取证工具

Nessue 要理解网络漏洞攻击,应该理解攻击者不是单独攻击,而是组合攻击。因此,本文介绍了关于Nessus历史的研究,它是什么以及它如何与插件一起工作。研究了Nessus的特点,使其成为网络取证中非常推荐的网络漏洞扫描工具…

maven高级知识。

目录 一、分模块开发 1、分模块开发设计 2、依赖管理 二、继承和聚合 1、聚合 2、继承 三、属性 1、基本介绍 2、版本管理 四、多环境配置与应用 1、多环境开发 2、跳过测试 五、私服 1、私服安装 2、私服仓库分类 一、分模块开发 1、分模块开发设计 ▶ 示意图 …

【测绘程序设计】——计算卫星位置

本文分享了根据广播星历计算卫星于瞬时地固系下位置的计算程序(C#版)(注:瞬时地球坐标系坐标经极移改正即可获得协议地球坐标系坐标),相关源代码(完整工程,直接运行;包含实验数据)及使用示例如下。 目录 Part.Ⅰ 使用示例Part.Ⅱ 代码分析Chap.Ⅰ 数据结构Chap.Ⅱ 计…

原生javascript手写一个丝滑的轮播图

通过本文,你将学到: htmlcssjs 没错,就是html,css,js,现在是框架盛行的时代,所以很少会有人在意原生三件套,通过本文实现一个丝滑的轮播图,带你重温html,css和js基础知识。 为什么选用轮播图做示例&…

网络运维和网络安全运维有什么区别?就业前景如何?

随着互联网的高速发展,运维安全已经成了大多数企业安全保障的基石。在如今的信息时代,无论是网络运维还是网络安全运维都成了不可缺少的一部分。因此导致很多人都容易把两者弄混淆。首先我们来了解一下网络运维和网络安全运维有什么区别呢?网…

Linux vi/vim教程

所有的 Unix Like 系统都会内建 vi 文本编辑器,其他的文本编辑器则不一定会存在。 但是目前我们使用比较多的是 vim 编辑器。 vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。 ** 什么是 vim?** Vim…

将vue-devtools打包成edge插件

文章目录一、从github拉vue-devtools源码二、用npm安装yarn三、使用yarn安装并编译源码四、将vue-devtools打包成edge插件五、离线安装edge插件一、从github拉vue-devtools源码 目前最新的版本是v6.5.0,地址:https://github.com/vuejs/devtools 二、用n…

第四阶段17-关于Redis中的list类型,缓存预热,关于Mybatis中的`#{}`和`${}`这2种格式的占位符

关于Redis中的list类型 Redis中的list是一种先进后出、后进先出的栈结构的数据。 在使用Redis时,应该将list想像为以上图例中翻转了90度的样子,例如: 在Redis中的list数据,不仅可以从左侧压入,也可以选择从右侧压入…

Linux04-冯诺依曼体系结构||操作系统||进程概念

1.认识冯诺依曼系统 1.1冯诺依曼体系结构 我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。 截至目前,我们所认识的计算机,都是有一个个的硬件组件组成 输入单元:包括…

Linux: 中断只被GIC转发到CPU0问题分析

文章目录1. 前言2. 分析背景3. 问题4. 分析4.1 ARM GIC 中断芯片简介4.1.1 中断类型和分布4.1.2 拓扑结构4.2 问题根因4.2.1 设置GIC SPI 中断CPU亲和性4.2.2 GIC初始化:缺省的CPU亲和性4.2.2.1 boot CPU亲和性初始化流程4.2.2.1 其它非 boot CPU亲和性初始化流程5.…