Qt中的信号与槽及其自定义

news2025/4/15 5:20:57

信号源:哪个控件发的信号

信号的类型:用户进行不同的操作就会触发不同的信号

如点击按钮,在输入框移动光标,勾选一个复选框,选 择一个下拉框

信号的处理方式:槽(slot)----也就是函数,Qt中用connet函数将信号与槽关联起来,后续只要信号触发了,Qt就会自动执行槽函数

-----所谓的槽函数,本质也是一种回调函数

Qt中一定是先关联信号和槽,任何再触发整个信号,顺序不能颠倒,否则信号触发时,调用槽就会失败

connect函数

是QObject类提供的静态的成员函数

Qt提供的类本身存在一定的继承关系,QObject是其它Qt内置类的父类,而所有控件都是Qt的内置类,都继承与QObject,因此都能使用connect(如QPushButton是QAbstractButtond的子类,QAbstractButton是QWidget的子类,QWidget又是QObject的子类

函数原型:

connect(const QObject* sender,

const char* signal,

const QObject* receiver,

const char* method ,

Qt::ConnectionType type = Qt::AutoConnection)

最后一个参数是默认参数,可以无需传参

sender表示信号源,表示是哪个控件发出信号

signal表示信号类型

receiver表示由哪个控件负责接收信号

method表示如何对信号进行处理---接收信号的槽函数

为什么传入的实参是函数指针类型,但是形参类型是char * 类型,他们是同一种类型吗?

一种是char* ,一种是void (*)(); 但是为什么他们能匹配呢?

c++中不允许使用两个不同的指针类型相互赋值

此处之所以不报错是因为文档查到的是以前旧版本的内容,

而现在接收槽,类型是一个泛型参数----Qt封装的类型萃取

实例:

创建一个按钮,当用户进行点击时,就会关闭窗口

先引入头文件,创建按钮,插入对象树,设置文本,移动位置

进行信号绑定时,绑定click而不是clicked

click是一个slot函数,作用就是在调用时相当于点击了一次按钮

而clicked是点击后发出的点击信号

Widget继承于QWidget,close是QWidget的槽函数,同样被Widget继承,可以直接在Widget中使用,作用是关闭当前窗口/控件

通过点击QPushButton控件,关闭Widget窗口

但是为什么点击QPushButton控件就会发生clicked信号?

通过Qt Assistant进行查看

在父类的signal中就可以找到clicked

查看信号时,最关注的就是信号的发送时机

自定义槽函数

槽---slot,就是一个普通的成员函数

在cpp文件中进行按钮的定义,插入对象树,设置内容,定义槽函数,在h文件中声明槽函数

借助ui界面,Qt Designer进行自定义槽函数

拖出一个按钮

右键点击按钮,选择转到槽

选中clicked点击ok后,直接跳转到槽定义函数

无需进行connect链接,而是由Qt Creator直接生成

可以正常调用

Qt中除了通过connect的方式链接信号和槽,还能函数名来链接信号和槽

如: void Widget::on_pushButton_clicked()

pushButton是发送信号的控件,clicked是信号类型,若函数名符号以上格式,则Qt自动连接信号和槽-----connectSlotsByName

如果通过图形化界面创建控件,就可以使用这种函数名连接信号槽的方式定义槽函数

如果通过代码创建控件,需要手动connect,因为代码中无connectSlotsByName函数

自定义信号

自定义信号比较少见,实际开发中很少需要自定义信号

因为Qt内置的信号,基本上已经覆盖了所有可能的用户操作

所谓Qt的信号,本质上也就是一个”函数”

在Qt5及更高版本中,槽函数和普通成员函数之间基本无区别

但是信号是一类非常特殊的函数

只需要写成函数声明,并告诉Qt这是一个“信号”即可

这个函数的定义,是在Qt编译过程中自动生成的

作为信号函数,返回值必须是void,有无参数都行,支持重载

在h文件中声明信号和槽

signals是Qt自己扩展的关键字

qmake时,调用工具自动生成相关定义

在cpp文件中进行连接和槽函数定义

但是运行之后,槽函数未被调用,因为尽管连接了信号和槽,但是没有发出信号

如何触发自定义的信号?

Qt内置信号时用户在ui界面进行某些操作时,自动触发对象信号

自定义信号需要通过代码手动发送---emit

也可以通过控件,将其槽函数设置为发送自定义信号,通过如点击按钮的方式调用槽函数,发送自定义信号

实际上emit无作用,只写一个mySignal也能发送信号,发送信号的操作包含在mySignal内部生成的函数定义中了

带参数的信号和槽

信号和槽也可以带参数,当信号带参数时,槽的参数必须和信号的参数一致

发送信号时,就可以给信号传递实参,将参数传递到对于的槽p,实现让信号给槽传参

在h文件中给自定义信号和槽函数声明带参数:

要求参数类型一致,,信号的参数个数必须要比槽的参数个数更多

发送带参数的信号,将参数传递给槽函数

槽函数接收参数后进行使用

可以通过给发送的信号传递不同的参数,调用同一个槽函数实现不同的效果

为什么允许信号的参数比槽的参数多?

一个槽函数可能绑定多个信号,若要求信号与槽参数必须一致,则槽和信号就变为一对一关系

如果槽和信号参数不一致,槽函数就会按照参数顺序,拿到信号的前n个参数

Qt中如果要让某个类实现信号槽,则可以在类中定义信号和槽函数,必须要在类最开始的地方,写Q_OBJECT宏,如果不加这个宏,编译时会报错

信号槽的意义

用于响应用户的操作

实现解耦合:把触发用户操作的控件和处理对于用户操作逻辑解耦合

实现多对多:一个信号可以connect到多个槽函数上,一个槽函数也可以被多个信号connect

断开信号和槽的连接

disconnect,使用方法和connect几乎一致

使用lambda表达式---语法糖定义槽函数

lambad本质是一个匿名函数,注意应用在”回调函数”场景中

如:

但是在lambda表达式中无法找到button控件,因为lambda表达式本质是一个回调函数,是无法直接获取到上层作用域中的变量

lambda引入“变量捕获”来解决无法获取上层作用域变量的问题

如:

需要注意的是,lambda表达式本质是回调函数,其内变量的生命周期特殊,由于此处button是new出的变量,声明周期跟随整个窗口,可以随时使用

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

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

相关文章

【PFPGA学习】状态机思想编程HDLbitsFPGA练习

目录 一、用状态机实现LED流水灯 1.1状态机思想 1.2状态机思想LED流水灯 1.3 modesim仿真 1.4 FPGA烧录实现 二、CPLD和FPGA芯片 1. 核心结构与技术原理 2. 性能与容量 3. 适用场景 4. 选型建议 三、HDLbitsFPGA练习记录(combinational logic…

Android 中集成 Unity 工程的步骤

在 Adroid 项目中集成 Unity 工程,主要步骤如下: 一、前提条件 1、已有一个 Android 工程项目; 2、Unity 工程已导出为 Android 工程,目录大概如下: 二、集成步骤 1、在 Android 工程中导入 Unity 工程的 unityLibrary 模块。 在 Android Studio 中,点击菜单栏 Fil…

Python从入门到精通全套视频教程免费

概述 📢 所有想学Python的小伙伴看过来!作为深耕编程领域的技术分享者,最新整理了一份Python从0到1的视频教程。 💡亮点 ✅ 保姆级系统路线:从环境搭建、语法精讲,到爬虫/数据分析/AI/Web全栈开发&#…

蓝桥杯:对字符串处理常用知识笔记

一、前面四个是计算带有空格字符串的的长度计算 C语言代码 #include<string.h> #include<stdio.h> int main() { char s[105]; gets(s); printf("%d", strlen(s)); return 0; } 算法2 C 代码&#xff08;常用&#xff09; #include <iostream> #in…

实现一个 Markdown 编辑器组件:Vue 3 + Vite + Highlight.js

文章目录 一、项目背景与需求分析二、搭建基础项目1. 初始化 Vue 3 项目2. 安装依赖 三、实现 Markdown 编辑器组件1. 创建 Markdown 编辑器组件2. 组件说明 四、优化与拓展1. 自动保存功能2. 文件上传功能 五、总结 一、项目背景与需求分析 在现代前端开发中&#xff0c;Mark…

帆软fvs文件中某表格新增数据来声提醒

1.上传音频文件到帆软安装目录的指定环境 准备一个音频文件&#xff08;如 mp3 格式&#xff09;&#xff0c;并将其放置在合适的目录。 例如&#xff1a;%FR_HOME%\webapps\webroot\help 2.点击 FVS 模板左上角「模板>页面加载结束事件」&#xff0c;输入以下 JavaScript …

从零用java实现 小红书 springboot vue uniapp (11)集成AI聊天机器人

前言 移动端演示 http://8.146.211.120:8081/#/ 管理端演示 http://8.146.211.120:8088/#/ 项目整体介绍及演示 前面的文章我们主要完成了基础模块的开发 这次我们跟一下热点 创建AI聊天机器人 并嵌入到我们的uniapp中 首先需要了解dify我已经完成了搭建win10 VMware安装ubuntu…

$_POST 超级全局变量

$_POST 是一个超级全局变量&#xff0c;在 PHP 中用于收集通过 HTTP POST 方法发送到服务器的数据。与 $_GET 不同&#xff0c;$_POST 允许发送大量数据&#xff0c;且数据不会显示在 URL 中&#xff0c;因此更适用于提交敏感信息&#xff0c;如用户登录信息、表单数据等。 使…

开发一个环保回收小程序需要哪些功能?环保回收小程序

废品分类展示与识别 详细分类列表&#xff1a;清晰展示常见废品类型&#xff0c;如废纸&#xff08;报纸、书本纸、包装纸等&#xff09;、塑料&#xff08;塑料瓶、塑料容器、塑料薄膜等&#xff09;、金属&#xff08;易拉罐、铁制品、铜制品等&#xff09;、玻璃&#xff0…

Debezium嵌入式连接postgresql封装服务

文章目录 1.项目结构&#xff1a;2.依赖&#xff1a;3.application.properties4.DebeziumConnectorConfig类5.TableEnum类6.TableHandler接口&#xff08;表处理抽象&#xff09;7.DefaultTableHandler默认实现类8.UserTableHandler处理类9.TableHandlerFactory工厂10.Debezium…

Python 爬取 1688.item_get_factory 接口:获取工厂档案信息实战指南

在电商采购和供应链管理中&#xff0c;了解供应商的工厂信息是至关重要的一步。1688 作为国内领先的 B2B 平台&#xff0c;提供了丰富的供应商和工厂档案信息。通过 item_get_factory API 接口&#xff0c;开发者可以获取工厂的详细信息&#xff0c;包括工厂名称、地址、联系方…

Rust所有权详解

文章目录 Rust所有权所有权规则作用域 内存和分配移动与克隆栈空间堆空间 关于函数的所有权机制作为参数作为返回值 引用与租借垂悬引用 Rust所有权 C/C中我们对于堆内存通常需要自己手动管理&#xff0c;手动申请和释放&#xff0c;即便有了智能指针&#xff0c;对于效率的影…

CExercise_07_1指针和数组_2数组元素的逆序数组逆序(指针版 reverse_by_ptr 和下标版 reverse_arr)

题目&#xff1a; 数组元素的逆序。要求使用[]运算符以及纯粹指针操作两种方式来完成。 关键点 arr[i] arr[len - 1 - i]; arr[0]arr[len-1]; 如果数组序列是偶数,则调换最中间一对为止;若为奇数,则单出一个不用反转. 思想就是长度取一半 eg:8/2, 9/24.5,反转一半,到5时固定…

框架PasteForm实际开发案例,换个口味显示数据,支持echarts,只需要标记几个特性即可在管理端显示(2)

PasteForm框架的主要思想就是对Dto进行标记特性,然后管理端的页面就会以不一样的UI呈现 使用PasteForm框架开发,让你免去开发管理端的烦恼,你只需要专注于业务端和用户端! 在管理端中,如果说表格是基本的显示方式,那么图表chart就是一个锦上添花的体现! 如果一个项目拥…

Starrocks的Bitmap索引和Bloom filter索引以及全局字典

写这个的主要作用是梳理一下Starrocks的索引效率以及使用场景。 Starrocks Bitmap索引 原理&#xff1a; Bitmap 索引是一种使用 bitmap 的特殊数据库索引。bitmap 即为一个 bit 数组&#xff0c;一个 bit 的取值有两种&#xff1a;0 或 1。 每一个 bit 对应数据表中的一行&…

QML面试笔记--UI设计篇05容器控件

1. QML中容器控件全解&#xff1a;构建灵活界面的基石 1.1. Item&#xff08;万物容器&#xff09;1.2. Rectangle&#xff08;视觉容器&#xff09;1.3. ListView&#xff08;动态列表容器&#xff09;1.4. Frame&#xff08;表单容器&#xff09;1.5. SwipeView&#xff08;页…

VSCode运行,各类操作缓慢,如何清理

VSCode写代码&#xff0c;随着项目逐步进展&#xff0c;代码量在增加&#xff0c;依赖的第三方头文件也在增加&#xff0c; 先是发现代码提示的速度变慢&#xff0c; 后来格式化代码速度太慢 然后c/c代码的语法检查有时候压根就失败&#xff0c;来个错误提示 还有source contro…

redis(2)-mysql-锁

1.数据倾斜&#xff1a; 解决&#xff1a;虚拟节点 2.缓存穿透&#xff1a;缓存雪崩、击穿 3.分布式锁 多把锁控制不同节点上的一致性问题。 锁是有失效时间的。 强制回收。 4.redis 和zookeeper的区别 redis 数据支持有效期 4.1 zookeeper 分布式一致性服务框架&am…

OpenLayers:海量图形渲染之矢量切片

最近由于在工作中涉及到了海量图形渲染的问题&#xff0c;因此我开始研究相关的解决方案。在咨询了许多朋友之后发现矢量切片似乎是行业内最常用的一种解决方案&#xff0c;于是我便开始研究它该如何使用。 一、什么是矢量切片 矢量切片按照我的理解就是用栅格切片的方式把矢…

AI智算-K8s+vLLM Ray:DeepSeek-r1 671B 满血版分布式推理部署实践

K8s + vLLM & Ray:DeepSeek-r1 671B 满血版分布式推理部署实践 前言环境准备1. 模型下载2. 软硬件环境介绍正式部署1. 模型切分2. 整体部署架构3. 安装 LeaderWorkerSet4. 通过 LWS 部署DeepSeek-r1模型5. 查看显存使用率6. 服务对外暴露7. 测试调用API7.1 通过 curl7.2 通…