当前位置: 首页 > news >正文

Qt信号和槽

信号和槽的概念

 在Linux中我们也学过信号 Signal,这是进程间通信的一种方式,这里大致分为三个要素:
信号源:谁发送的信号(用户进程,系统内核,终端或者作业控制,)
信号的类型:哪种类别的信号

信号的处理方式:注册信号处理函数,在信号被触发时自动调用执行。

Qt信号和Linux的信号虽然不是同一个概念,但是有很多相似之处。、

在Qt中,谈到信号,也是三个要素:

信号源:由哪个控件发出的。
信号的类型:用户进行不同的操作,就会发送不同的信号。比如点击按钮,在输入框中移动光标

信号的处理方式:也就是槽(slot),其实也就是一个函数。Qt中用connect这样的函数,将一个信号和一个槽关联起来,后续只要信号触发了,就会自动执行槽函数。

槽函数本质也是一种 “回调函数”

关于connect函数 

connect和Linux TCP Socket 中建立连接的函数没有任何关联。

connect是Qt中,QObject类中的一个静态成员函数。

在Qt提供的这些类中,本身是存在一些继承关系的。

QObject可以说是Qt所有内置类的 “祖宗类” 

关于connect的具体使用方式:
 这里的第2 4个参数是Qt5以前的,在Qt5以后就使用了泛型类型。

另外,关于这个信号其实也是Qt中的对象中的一些成员函数,现在有这样一个代码:

这个代码就是创建了一个按钮,当我们点击按钮的时候,这个Widget的窗口就会关闭。

可以看到,关于信号我用的是QPushButton中的clicked,但是这个clicked不一定就是在QPushButton中定义的,而是在它的父类中定义的

将光标移动到clicked上,可以看到

 这里可以看到它的参数类型,返回值,包括注释中提示了它是一个qt_signal,下面还可以看到它是在哪个类的成员函数。

再看一下槽函数close

 

同样可以看到,并且它是QWidget内置的函数 

而我们的Widget就继承自QWidget

当我们想查看某个函数的具体定义时,可以将光标移动到函数上,然后 ctrl + 左键即可跳转到定义

自定义槽函数 

 在Qt5以及更高版本中,自定义一个槽函数的过程跟自定义一个普通的成员函数没有什么区别。

这种定义的方式我们之前也是用过的。

 还有一种自定义的方式:
在图形化界面这里:

右键一个控件后,有一个转到槽

这里面就把这个控件能用到的信号全部展示了出来,包括有它的父类的信号,也有它的父类的父类的信号。

比如我们之前用的clicked。点击之后

就会自动帮我们生成一个槽函数的定义:

 在这里我们就只需要编写我们槽函数的代码即可。

发现是没有问题的。

因此:在Qt中,除了通过connect来连接信号槽之外,还可以通过函数名字的方式来自动连接。

这个函数的名字要符合以下格式:

on_(这个对象的名字)_(信号的名字) 

 如果不符合这样的格式,那么就不会连接成功。

另外,我们刚刚是通过图形化界面的方式创建的控件,想要以这种方式来连接槽函数还需要一个前提:

在我们自动生成的ui_widget.h中会自动调用这个。

总结:
如果图形化界面创建控件的话,推荐使用第二种这样快速的方式来设置连接槽函数 

如果是以代码的方式创建控件的话,那还是需要用connect手动连接槽函数,因为在我们的代码中并没有调用:connectSlotsByName

自定义信号

自定义槽函数还是非常关键和常见的。

但是自定义信号就比较少见了,在GUI中,用户能够进行哪些操作,其实是可以穷举的。

在Qt内置的信号里,已经足以覆盖绝大部分使用场景了。

Qt信号本质也是一个函数。

但是这个函数比较特殊,我们程序员只需要写出函数的声明,并且告诉Qt这是一个信号,那么Qt就会在编译时自动帮我们生成函数的定义,并且这个过程程序员是无法干预的。

关于这个信号函数:它的返回值必须是void,有没有参数都可以,甚至还可以重载。

在声明信号函数前,要加上 signals: 这样的关键字:

这也是Qt自己扩展出来的关键字。

这里展示一下自定义信号的过程:
首先定义好自定义信号和槽函数:

关于自定义槽函数那里这个写法是为了提高代码可读性,说明这是一个槽函数,在Qt5以前的版本,是必须要这样写的。

关于这个槽函数的定义:

 然后再调用connect进行连接

注意这里发出信号的对象和执行槽函数的对象。

最后,我们该怎样将这个信号发射出去呢?
我们可以选一个它会在哪里发送:
假设我们将其放在另一个槽函数中:

这是按钮1的将来触发信号会执行的槽函数。

点击之后,我们的信号确实就被发送了,也执行了我们设置的槽函数。

这里又有一个关键字 emit,这个关键在Qt5以及更高版本中可以不加,但是还是建议加上,因为可以提高代码的可读性,告诉程序员这是在发送信号:

还有一个函数就是 disconnect,顾名思义就是解除某一个信号和槽函数的连接,它的参数和connect大致相同,只是执行的操作相反,在实际开发中也使用的较少。

不过如果是Qt自动连接的槽函数,那么想使用disconnect的解除连接,可能会不行。 

关于带参数的信号和槽 

到这里我们已经清楚,Qt中的信号和槽其实就是一个函数,那么它们也是可以有参数的。

这里的参数有这样的规定,那就是:
带有参数的信号,要求信号的参数和槽的参数一致(类型要一致)。

 但是信号的参数可以比槽函数的参数多,如果多了的话,槽函数就会按照参数的顺序,拿到信号的前N个参数;但是参数少了不行。

另外,在Qt中,我们发现在Qt的某个类的最开始的地方都有一个宏:

这是Qt的硬性规定,只有有这个宏,才能让类使用信号槽。

为什么要有信号槽机制

 在其它的GUI的框架中,一般都是一对一的关系,就是一个控件就对应一个函数。

但是Qt这里既可以一对一,也可以一对多,还可以多对多。

但是实际开发中,一对一就已经满足绝大部分场景了。

总结:
Qt设计信号槽的原因:

1.想把触发 用户操作的控件和处理对应用户的操作逻辑进行解耦合。

2.实现多对多的效果。

使用lambda表达式 

用connect进行连接槽函数,这个槽函数我们也可以通过lambda表达式的方式传入。

对于一些很简单的槽函数,并且是一次性使用的,我们直接传入一个lambda表达式即可。

并且捕获的时候,建议使用值捕获,因为在Qt中,捕获的一般都是控件的指针,如果是引用的话,那么还得关注这个变量的生命周期。

相关文章:

Qt信号和槽

信号和槽的概念 在Linux中我们也学过信号 Signal,这是进程间通信的一种方式,这里大致分为三个要素: 信号源:谁发送的信号(用户进程,系统内核,终端或者作业控制,) 信号的类…...

Python知识点精汇!字符串:定义、截取(索引)和其内置函数

目录 一、字符串的定义 二、字符串的截取 1.截取干啥的 2.怎么用截取 3.打印多次 4.两个字符串拼接在一起 三、字符串内置函数 1.查询函数: (1)find(str,start,end) (2)index(str,start,end&#…...

【CV】头盔检测区域入侵项目

文章目录 🌕项目和数据下载🌙安全帽佩戴数据集🌕收集数据数据🌕wbem格式视频转avi或者mp4🌕跑通区域入侵🌙多边形标注工具下载🌙使用Python脚本打开视频获取一张用来标注的图片🌙打开labelme标注一个多边行🌙程序可以识别的标注json格式🌙修改代码读取Json…...

大数据应用开发——实时数据处理(一)

前言 大数据应用开发——实时数据采集 大数据应用开发——实时数据处理 Flink完成Kafka中的数据消费,将数据分发至Kafka的dwd层中 并在HBase中进行备份 大数据应用开发——数据可视化 hadoop,zookeeper,kafka,flink要开启 目…...

Wireshark中的length栏位

注:Ethernet II的最小data length为46,如果小于,会补全到46. 1.指定网卡抓取的,链路为ethernet。 IPv4 Ethernet II 长度为 14 bytes - L1ipv4 header中的length包括header和payload的总长度 - L2wireshark中length表示抓取的pac…...

IDEA中创建多模块项目步骤

步骤 1:使用 Spring Initializr 创建父项目 打开IntelliJ IDEA,选择 File > New > Project。选择 Spring Initializr 并配置项目信息: Group ID:例如 com.aqian,用于项目的组织标识。Artifact ID:例…...

深度学习笔记13-卷积神经网络1

1.卷积神经网络 卷积神经网络(CNN),它是由多个卷积层、池化层和全连接层构成的前馈神经网络。在卷积神经网络中,包含了可训练的卷积核,这使得卷积神经网络具有强大的表征学习能力。卷积神经网络通过卷积层和池化层进行…...

【新华妙笔-注册/登录安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…...

STM32电源管理—实现低功耗

注: 本文是学习野火的指南针开发板过程的学习笔记,可能有误,详细请看B站野火官方配套视频教程(这个教程真的讲的很详细,请给官方三连吧) 在响应绿色发展的同时,在很多应用场合中都对电子设备的功…...

【链路层】空口数据包详解(4):数据物理通道协议数据单元(PDU)

目录 一、概述 1.1. 头部(Header)结构 1.2. MIC字段的情况说明 1.3. 有效载荷(Payload)格式与LLID字段的关联 二、LL Data PDU 2.1. 定义与用途 2.2. 头部字段设置 2.3. 空PDU(Empty PDU ) 2.4. 数…...

数学分组求偶数和

问题描述 小M面对一组从 1 到 9 的数字,这些数字被分成多个小组,并从每个小组中选择一个数字组成一个新的数。目标是使得这个新数的各位数字之和为偶数。任务是计算出有多少种不同的分组和选择方法可以达到这一目标。 numbers: 一个由多个整数字符串组…...

机器学习基础02_特征工程

目录 一、概念 二、API 三、DictVectorize字典列表特征提取 四、CountVectorize文本特征提取 五、TF-IDF文本1特征词的重要程度特征提取 六、无量纲化预处理 1、MinMaxScaler 归一化 2、StandardScaler 标准化 七、特征降维 1、特征选择 VarianceThreshold 底方差…...

CSS Modules中的 :global

最近写需求遇到如下代码,我们来分析一番: .medicine-bot {:global(.cosd-site-vcard-card) {margin-top: -3px;}:global(.cosd-site-vcard-title-text) {font-size: var(--cos-text-headline-sm);}:global(.cosd-site-vcard-button) {background-color: …...

linux病毒编写+vim shell编程

学习视频来自B站UP主泷羽sec,如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 请一定遵循《网络空间安全法》!!! Linux目录介绍 /bin 二进制可执行文件(kali里面是工具一些文件)/etc 系统的管理和配置文…...

WinDefender Weaker

PPL Windows Vista / Server 2008引入 了受保护进程的概念,其目的不是保护您的数据或凭据。其最初目标是保护媒体内容并符合DRM (数字版权管理)要求。Microsoft开发了此机制,以便您的媒体播放器可以读取例如蓝光,同时…...

智能工厂的设计软件 为了监管控一体化的全能Supervisor 的监督学习 之 序5 架构for认知系统 总述 (架构全图)

本文提要 本文讨论的“智能工厂的设计软件” for认知系统的架构全图 ,这有别于前面所说的“智能工厂的设计软件”的“全景图”。两者在内容和侧重点上有所不同,但它们共同构成了对智能工厂设计软件的全面描述。 全景图是对智能工厂设计软件的整体概览&…...

vmware集群 vSAN HCL 数据库

HCL数据库升级 https://partnerweb.vmware.com/service/vsan/all.json VSAN版本目录升级 https://vcsa.vmware.com/ph/api/v1/results?deploymentId2d02e861-7e93-4954-9a73-b08692a330d1&collectorIdVsanCloudHealth.6_5&objectId0c3e9009-ba5d-4e5f6-bae8-f25ec5…...

人工智能引发直播革命:AI 技术塑造无人直播全新体验

在数字化浪潮席卷全球的今天,人工智能(AI)技术以其无与伦比的速度和广度,正深刻地改变着各行各业的面貌。其中,直播行业作为新媒体时代的宠儿,也迎来了由AI技术引领的颠覆性变革。这场由人工智能引发的直播…...

数据研发基础 | 什么是流批一体

流批一体的概念是可能出现在大厂的面试题中的,虽然就算大厂实习也没机会实操这样的高级操作,学一点概念,面试多少是能说上一两句的。大致就是希望一套代码能同时在批处理和流处理中运行(同时做离线计算和实时计算)。下…...

《Python网络安全项目实战》项目6 编写密码工具程序

《Python网络安全项目实战》项目6 编写密码工具程序 项目6 编写密码工具程序任务6.1 猜数字游戏任务描述任务分析任务实施6.1.1 编写基本的猜数字程序6.1.3 测试并修改程序6.1.4 给程序增加注释 任务拓展任务实施6.2.1 生成随机密码6.2.4 菜单功能 相关知识1. 密码字典2. 密码字…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

大话软工笔记—需求分析概述

需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中&#xff0…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

DiscuzX3.5发帖json api

参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...