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. 密码字…...

现代C++HTTP框架cinatra
文章目录 cinatra简介主要特点 快速上手编译器版本要求使用指南快速示例 项目地址 cinatra简介 cinatra是一个基于C20协程的高性能HTTP框架,它的目标是提供一个快速开发的C HTTP框架解决方案 它不仅支持HTTP/1.1和1.0,还支持SSL和WebSocket,…...

【功耗现象】com.gorgeous.lite后台Camera 使用2小时平均电流200mA耗电量400mAh现象
现象 轻颜相机(com.gorgeous.lite)后台Camera 使用2小时平均电流200mA(BugReport提供的电流参考数据),耗电量400mAh 即耗电占比(200mA*2h)/(12.83h*52.68mA )400mAh/623mAh62% CameraOct 10 202321:03:08 - 23:03:372h16m15s859ms to 4h16m44s984msactive duration: 2h 0m 29…...

06.VSCODE:备战大项目,CMake专项配置
娇小灵活的简捷配置不过是年轻人谈情说爱的玩具,帝国大厦的构建,终归要交给CMake去母仪天下。一个没有使用 CMake 的 C 项目,就像未来世界里的一台相声表演,有了德纲却无谦,观众笑着遗憾。—— 语出《双城记》作者&…...

还是小时候味道的麻辣片
麻辣片的诞生,源于人们对辣味的热爱和对丰富口感的追求。它将辣椒的火辣、香料的浓郁和豆制品的醇厚完美结合在一起,创造出了一种令人回味无穷的美食体验。无论是在学校的小卖部、街头的小吃摊,还是超市的货架上,麻辣片都以其鲜艳…...

GaussDB部署架构
GaussDB部署架构 云数据库GaussDB管理平台(TPOPS)基于B/S架构开发,由Web、管控Service、管控Agent三部分组成,软件结构如图1所示。 图1 各节点部署架构 Web:作为用户接入子系统,用于将用户在Web下发的操作…...

遥测数据采集工具Grafana Alloy
介绍 Alloy是Grafana产品公司旗下的一款新主推遥测数据采集工具,Grafana Alloy也是一个开源OpenTelemetry收集器,具有内置 Prometheus管道并支持指标、日志、跟踪和配置文件。Alloy支持为OTEL、Prometheus、Pyroscope、Loki等服务提供许多指标、日志、跟…...

线性数据结构
数组 数组(Array) 是一种很常见的数据结构。它由相同类型的元素(element)组成,并且是使用一块连续的内存来存储。 我们直接可以利用元素的索引(index)可以计算出该元素对应的存储地址。 数组…...

【ArcGIS微课1000例】0127:计算城市之间的距离
本文讲述,在ArcGIS中,计算城市(以地级城市为例)之间的距离,效果如下图所示: 一、数据准备 加载配套实验数据包中的地级市和行政区划矢量数据(订阅专栏后,从私信查收数据),如下图所示: 二、计算距离 1. 计算邻近表 ArcGIS提供了计算点和另外点之间距离的工具:分析…...

【算法】二分
1. 找到有序区间中 x 最左边的数字的位置 static int getL(int a[], int l, int r, int x) {while (l < r) {int mid l r >> 1;if (x < a[mid]) {r mid;} else {l mid 1;}}if (a[l] ! x) return -1;return l;} 2. 找到有序区间中 x 最右边的数字的位置 stati…...

ARM CCA机密计算安全模型之简介
安全之安全(security)博客目录导读 目录 1、引言 2、问题陈述 3、CCA 安全保证 3.1 对领域所有者的安全保证 3.2 对host环境的安全保证 Arm 机密计算架构(CCA)安全模型(SM)定义了 CCA 隔离架构的安全要求和基本安全属性。这…...