【Qt-信号与槽】connect函数的用法
🏠个人主页:Yui_
🍑操作环境:Qt Creator
🚀所属专栏:Qt

文章目录
- 1.信号和槽的概念
- 1.1 信号的本质
- 1.2 槽的本质
- 1.3 补充说明
- 2. 信号和槽的使用
- 2.1 connect函数介绍
- 2.2 connect函数的简单使用
- 2.2.1 图形化方式
- 2.2.2 代码方式
- 2.3 查看内置信号和槽
- 3. 知识补充——connect的参数类型问题
在正式介绍
connect函数前,还需要好好了解信号和槽的概念
1.信号和槽的概念
所谓信号大家都不陌生,生活中的红绿灯就是一种信号,当出现红灯时,你就接受到了一个红灯信号,然后指向停下来的动作。

同时,如果你也有学习Linux的经历,也会学到信号Signal,是系统内部的通知机制。
Linux中的信号会涉及到3个要素:
- 信号源:谁发送的信号。
- 信号的类型:哪种类型的信号。
- 信号的处理:执行自定义的信号处理函数或者使用系统默认的处理函数。
Qt中的信号和Linux中的信息,虽然不是一样的概念,但其实也有相似之处。
Qt中谈到信号,也会涉及到三个要素: - 信号源:由哪个控件发出的信号。
- 信号的类型:用户进行的不同操作,比如’用户点击按钮’、'用户关闭窗口’都是一个事件,每个事件都会发出一个信号,点击按钮触发点击信号,在输入框中移动光标,触发移动光标的信号。
- 信号的处理方式:Qt中的所有控件都具有接受信号的能力,一个控件还可以接受多个不同的信号。对于接受到的每个信号,控件都会做出响应的动作,在Qt中,对信号做出的响应动作就称之为槽。
我们写GUI程序,就是要让用户进行操作,就是要和用户进行交互,这个过程中就需要关注,用户当前的具体操作是什么样的操作。
信号和槽是Qt中特有的消息传输机制,他能将相互独立的控件关联起来,比如按钮和窗口本身就是两个独立的控件,点击按钮并不会对窗口造成任何影响。通过信号和槽机制,可以将按钮和窗口进行关联,实现点击按钮会使窗口关闭的效果。
演示:

现在你可能看不懂,但当学完connect函数就没问题了。

1.1 信号的本质
信号的本质是事件
信号是由于用户对窗口或者控件进行了某种操作,导致窗口或者控件产生了某个特定的事件,这时Qt对于的窗口类会发送某个信号,以此对用户的操作做出反应。
常见的事件有:
- 按钮单点、双击。
- 窗口刷新。
- 键盘输入。
。。。
那么信号Qt中的信号通过什么样的形式呈现够使用者的呢?
当某个事件产生了,Qt框架会调用某个对应的信号函数,通知使用者。
信号的呈现形式就是函数
1.2 槽的本质
槽的本质就是对信号响应的函数,是一个回调函数。
槽函数与一般的函数不同,槽函数可以与一个信号关联,当信号产生时,关联的槽函数会自动被执行。
1.3 补充说明
信号和槽机制底层是通过函数间的相互调用实现的,每个信号都可以用函数来表示,称为信号函数,每个槽也可以用函数表示,称为槽函数。例如按钮被按下,这个信号可以用clicked()函数表示,窗口关闭这个槽可以用close()函数表示,假如使用信号和槽机制实现点击按钮会关闭窗口的功能,其实就是使用clicked()函数调用close()函数的效果。
信号函数和槽函数通常位于某个类中,和普通的成员函数相比,它们的特别在于:
- 信号函数使用
signals关键词修饰,槽函数用private slots/protected slots/public slots修饰。signals/slots是Qt中在C++的基础上扩展的关键字,专门指明信号函数和槽函数。 - 信号函数只需要声明,不需要定义(实现),而槽函数需要定义(实现)。
信号函数的定义自动在编译之前生成,编写Qt应用程序的程序员无需关注。
这种自动生成代码的机制称为元编程,在很多场景中都能见到。
2. 信号和槽的使用
在Qt中,QObject类提供了一个静态成员函数connect()函数,改函数专门用来关联指定的信号函数和槽函数。
2.1 connect函数介绍
connect(const QObject* sender,const char* singal,const QObject* receiver,const char* method,Qt::ConnectionType type = Qt::AutoConnection)
参数说明:
- sender:信号的发送者。
- signal:发送的信号(信号函数)。
- receiver:信号的接受者。
- method:接受信号的槽函数。
- type:用于指定关联的方式,默认的关联方式为
Qt::AutoConnection,通常不需要手动设置。
2.2 connect函数的简单使用
connect函数的简单使用,我们要实现的功能就是点击按钮使得按钮上的Hello World变成Hello Yui.
2.2.1 图形化方式

开始编辑处理代码:
widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->pushButton,&QPushButton::clicked,this,&Widget::handle);
}Widget::~Widget()
{delete ui;
}void Widget::handle()
{ui->pushButton->setText("Hello Yui");
}

2.2.2 代码方式
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);button = new QPushButton(this);button->setText("Hello World");button->move(200,200);connect(button,&QPushButton::clicked,this,&Widget::handle);
}Widget::~Widget()
{delete ui;
}void Widget::handle()
{button->setText("Hello Yui");
}

2.3 查看内置信号和槽
系统自带的信号和槽通常通过Qt的帮助文档来查询。
就比如我们要查看按钮的信号,在帮助文档中输入QPushButton

然后再去文档中寻找signals
如果没有找到,继续去父类中查找。比如QPushButton的父类QAbstractButton


3. 知识补充——connect的参数类型问题
connect(const QObject* sender,const char* singal,const QObject* receiver,const char* method,Qt::ConnectionType type = Qt::AutoConnection)
可以看到的是singal和method的类型都是char* ,但是我们传递的却是函数指针,就比如method的函数指针类型是void(*)()这可对不上,C++可不允许你使用两个不同的指针类型相互赋值。那么这是怎么一回事呢?
以这个代码为例
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);button = new QPushButton(this);button->setText("Hello World");button->move(200,200);connect(button,&QPushButton::clicked,this,&Widget::handle);
}Widget::~Widget()
{delete ui;
}void Widget::handle()
{button->setText("Hello Yui");
}
现在的写法为
connect(button,&QPushButton::clicked,this,&Widget::handle);
但是在Qt5以前的写法为:
connect(button,SIGNAL(&QPushButton::clicked),this,SLOT(&Widget::handle));
Qt5开始,对上述的写法做出了简化,不需要写SIGNAL和SLOT宏了,给connect提供了重载版本,在重载版本中,第二个参数和第四个参数成了泛型参数,允许我们传入任意类型的函数指针了。
按住ctrl加鼠标左键跳转

此时的connect函数就带有一定的参数检查功能,
如果你传入的第一个参数和第二个参数不匹配,或者第三个参数和第四个参数不匹配,代码会编译出错,这里用到了类型萃取。
往期文章:
【Qt】初始项目代码解释-CSDN博客
【Qt】HelloWorld程序-CSDN博客
相关文章:
【Qt-信号与槽】connect函数的用法
🏠个人主页:Yui_ 🍑操作环境:Qt Creator 🚀所属专栏:Qt 文章目录 1.信号和槽的概念1.1 信号的本质1.2 槽的本质1.3 补充说明2. 信号和槽的使用2.1 connect函数介绍2.2 connect函数的简单使用2.2.1 图形化方…...
计算机毕业设计SpringBoot+Vue.js景区民宿预约系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
服务流程设计和服务或端口重定向及其websocket等应用示例
服务流程设计和服务或端口重定向及其websocket等应用示例 目录 服务或端口重定向的服务设计和websocket等应用示例 一、通用请求控制流程 1.1、入口 1.2、所有GET请求首先预检控制单元 1.3、http请求会分别自动307重定向 1.4、所有请求首先执行跨源控制单元 1.5、然后…...
16. LangChain实战项目2——易速鲜花内部问答系统
需求简介 易束鲜花企业内部知识库如下: 本实战项目设计一个内部问答系统,基于这些内部知识,回答内部员工的提问。 在前面课程的基础上,需要安装的依赖包如下: pip install docx2txt pip install qdrant-client pip i…...
一文了解Conda使用
一、Conda库频道 conda的软件频道是存储软件包的远程位置,当在Conda中安装软件包时,它会从指定的频道中下载和提取软件包。频道包含了各种软件包,不同的频道可能提供不同版本的软件包,用户可以根据需要选择适合的版本。 常见 Co…...
AI辅助学习vue第十四章
第十四章:技术引领与未来展望 在第十五章,你已经在Vue技术领域深耕许久,积累了丰富的经验与卓越的影响力。此时,你将站在行业前沿,引领技术走向,为Vue技术的未来发展开辟新道路。 1. 引领Vue技术发展方向…...
chromadb向量数据库使用 (1)
目录 完整代码代码解释 完整代码 import chromadb chroma_client chromadb.Client()collection chroma_client.create_collection(name"my_collection")collection.add(documents["This is a document about pineapple","This is a document about…...
CSS—text文本、font字体、列表list、表格table、表单input、下拉菜单select
目录 1.文本 2.字体 3.列表list a.无序列表 b.有序列表 c.定义列表 4.表格table a.内容 b.合并单元格 3.表单input a.input标签 b.单选框 c.上传文件 4.下拉菜单 1.文本 属性描述color设置文本颜色。direction指定文本的方向 / 书写方向。letter-spacing设置字符…...
关于大型语言模型的结构修剪
本文介绍了一种名为 **LLM-Pruner** 的方法,用于对大型语言模型(LLMs)进行结构化剪枝,以减少模型大小和计算需求,同时保留其多任务解决和语言生成能力。LLM-Pruner 通过依赖检测和重要性估计实现高效剪枝,并…...
PostgreSQL 生产环境升级指南:pg_upgrade 快速完成版本升级!
前言 PostgreSQL 的版本号由主要版本号和次要版本号组成。例如,在 10.1 中,10 是主要版本,1 是次要版本。关于更多版本的规划,请参考 PostgreSQL 版本路线图。 版本号规则: PostgreSQL 10 及以后:版本号…...
Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调
Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调 环境准备创建Python微调环境准备数据集准备模型文件 模型微调模型预测原始模型预测微调模型预测 使用unsloth,可以方便地对大模型进行微调。以微调DeepSeek-R1-Distill-Llama-8B为…...
JAVA面试常见题_基础部分_mybatis面试题
1、什么是 MyBatis? 答:MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。 2、讲下 MyBatis 的缓存答 :MyBatis 的缓存分为一级缓存和二级缓存,一级缓存放在 session 里面,默认就有,二级缓存放在它的命名空间里,默认是不打…...
RISC-V汇编学习(一)—— 基础认识
最近这三年的工作时间大部分的工作,都是基于riscv的cpu和接口ip开发适配驱动,时不时的就要debug测试代码,面对很多都是汇编,所以也是整理下积累的一点点笔记,系列博客将总结下riscv相关的内容,一是给有需要…...
【Delphi】如何解决使用webView2时主界面置顶,而导致网页选择文件对话框被覆盖问题
一、问题描述: 在Delphi 中使用WebView2控件,如果预先把主界面置顶(Self.FormStyle : fsStayOnTop;),此时,如果在Web页面中有使用(<input type"file" id"fileInput" acc…...
基于POI的Excel下拉框自动搜索,包括数据验证的单列删除
目录 目标 例子 1.搜索下拉框页 2.数据源页 3.效果 代码以及注意事项 1.代码 2.注意事项 1.基于Excel的话,相当于加入了一个【数据验证】 2.代码中的一些方法说明 目标 期望在Excel利用代码创建具备自动搜索功能的下拉框 例子 1.搜索下拉框页 2.数据源…...
基金 word-->pdf图片模糊的解决方法
1. 首先需要Adobe或福昕等pdf阅读器。 2. word中 [文件]--[打印],其中打印机选择pdf阅读器,例如此处我选择福昕阅读器。 3. 选择 [打印机属性]--[编辑]--[图像],将所有的采样、压缩均设置为 关闭。点击[另存为],保存为 基金报告…...
React底层原理详解
React中Element&Fiber对象、WorkInProgress双缓存、Reconcile&Render&Commit、第一次挂载过程详解 在面试中介绍React底层原理时,需遵循逻辑清晰、层次分明、重点突出的原则,结合技术深度与实际应用场景。以下是结构化回答模板:…...
Word 插入图片会到文字底下解决方案
一、现象描述 正常情况下,我们插入图片都是这样的。 但有时突然会这样,插入的图片陷于文字底部。 二、网上解决方案 网上有教程说,修改图片布局选项,从嵌入型改成上下型环绕。改完之后确实有用,但是需要手动拖动图片…...
基于DeepSeek 的图生文最新算法 VLM-R1
目录 一、算法介绍 二 算法部署 三 模型下载 四 算法测试 五 可视化脚本 一、算法介绍 VLM-R1:稳定且可通用的 R1 风格大型视觉语言模型 自从 Deepseek-R1 推出以来,出现了许多专注于复制和改进它的作品。在这个项目中,我们提出了 VLM-R1,一种稳定且可通用的 R1 风格…...
Composer如何通过GitHub Personal Access Token安装私有包:完整教程
使用Composer安全管理您的PHP私有依赖包 一、前言 在PHP开发中,我们经常需要将内部工具包托管为私有仓库。传统的账号密码验证方式存在安全隐患,而GitHub Personal Access Token(PAT)提供了一种更安全的鉴权方案。本文将通过4个…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
