【Qt秘籍】[009]-自定义槽函数/信号
自定义槽函数
在Qt中自定义槽函数是一个直接的过程,槽函数本质上是类的一个成员函数,它可以响应信号。所谓的自定义槽函数,实际上操作过程和定义普通的成员函数相似。以下是如何在Qt中定义一个自定义槽函数的步骤:
步骤 1: 定义槽函数
- 选择位置: 槽函数通常定义在类的声明部分。在Qt 5及以上版本中,虽然不是强制要求,但传统上槽函数会放置在
public slots:区域下。如果希望保持代码的清晰度和一致性,这样做是个好习惯。
class MyClass : public QWidget {Q_OBJECT // 必须包含,以便使用信号和槽机制public:MyClass(QWidget *parent = nullptr);~MyClass();public slots: // 槽函数区域void myCustomSlot(); // 自定义槽函数声明
};
步骤 2: 实现槽函数
接下来,在类的实现文件(.cpp)中为槽函数提供具体的实现。
void MyClass::myCustomSlot() {qDebug() << "自定义槽函数被调用了!";// 在这里可以添加代码
}
步骤 3: 连接信号到槽
为了让槽函数响应特定的信号,你需要使用QObject::connect()函数来建立信号和槽之间的连接。
MyClass myObject;
QPushButton button("点击我", &myObject);// 连接按钮的clicked()信号到自定义槽函数
connect(&button, &QPushButton::clicked, &myObject, &MyClass::myCustomSlot);
在这个例子中,当按钮被点击时,myCustomSlot槽函数就会被调用。
注意事项:
- 确保你的类包含
Q_OBJECT宏,这是使用信号和槽机制的前提。- Qt 5开始支持lambda表达式作为槽函数,这为编写更简洁的代码提供了可能。
- 如果你的槽函数不需要访问类的成员或不需要作为对象的成员存在,也可以声明为全局函数或静态成员函数。
- 使用新式连接语法(如上述示例所示),它提供了类型安全和更好的编译时检查。
图形化界面
实际上,Qt的图形化界面让你能更加轻松的自定义槽函数。
步骤:
1.当你使用图形化界面直接拖拽一个pushbutton,右键点击可以发现可以直接 "转到槽..."

2.直接点击 clicked() ==> OK

3.Qt Creator 直接生成好了函数定义和声明,因此我们可以直接在此函数内部编写代码即可。
//widget.hprivate slots:void on_pushButton_clicked();//widget.cppvoid Widget::on_pushButton_clicked()
{//在此处补充你的代码
}
如下图笔者给出的示例代码,当点击new按钮会使得左上角文字替换

问题:
为什么"转到槽..."(Go To Slot...)能在没有添加connect的情况下,将组件和函数关联起来?
回答:
"转到槽函数"(Go To Slot)是Qt Creator集成开发环境(IDE)提供的一项便捷功能,它允许开发者通过图形界面快速创建槽函数并自动关联到特定组件的信号上,而无需手动编写connect()代码行。这一自动化过程基于Qt的元对象系统(Meta-Object System)和Qt Creator对UI文件(如.ui文件)的处理机制。
当你在Qt Designer中右键点击一个控件并选择"转到槽..."(Go To Slot...),IDE会自动执行以下操作:
生成槽函数: 如果你选择了一个预定义的信号(比如按钮的
clicked()信号),Qt Creator会检查你的类是否已经有一个与之匹配的槽函数(命名规则通常是on_控件对象名_信号名())。如果没有,IDE会提示你创建这样一个槽函数,并自动生成相应的函数声明和定义。自动连接: 对于遵循特定命名约定的槽函数,Qt Creator和moc(Meta-Object Compiler)会在编译时自动处理信号与槽的连接。这意味着,如果你按照约定命名了槽函数,即使你在代码中没有显式看到
connect调用,信号和槽也会在运行时正确地关联起来。UI文件处理: 当UI文件被编译为对应的C++代码(通常通过
uic工具),这些自动关联的信息会被嵌入到生成的代码中,从而确保信号和槽在应用程序运行时能够正确交互。
因此,虽然表面上看起来没有手动添加connect()调用,但实际上是在IDE和编译流程中隐式完成了信号与槽的连接工作,确保了组件和函数能够正确关联。

自定义信号
在Qt中自定义信号涉及以下几个简单步骤:
步骤 1: 声明信号
- 定义信号: 在类的声明中,你需要在
signals:区域声明你的自定义信号。信号通常返回类型为void,并且不需要实现(即没有函数体)。
class MyClass : public QObject {Q_OBJECT // 必须包含,以便使用信号和槽机制public:MyClass(QObject *parent = nullptr);signals: // 信号区域void customSignal(int value); // 自定义信号声明,参数可以根据需要设定
};
步骤 2: 发射信号
在类的实现中,你可以使用emit关键字来触发(发射)信号。通常,这会在某个特定条件满足或者事件发生时执行。
MyClass::MyClass(QObject *parent) : QObject(parent) {// 在适当的位置发射信号,例如初始化完成后或者某个事件响应时emit customSignal(42);
}
或者在类的其他成员函数内部根据需要发射信号:
void MyClass::someFunction() {// 根据逻辑判断发射信号if (someCondition) {emit customSignal(getSomeValue());}
}
注意事项:
- 确保类定义中包含了
Q_OBJECT宏,这是使用信号和槽机制的基础。- 信号可以有任意数量和类型的参数,但不能有默认值,且返回类型必须是
void。- 信号的命名通常以“signal”结尾,尽管这不是强制性的,但这样的命名约定有助于代码的可读性。
- 发射信号是线程安全的,即使在非主线程中也可以安全地发射信号。
通过以上步骤,你就成功地在Qt中自定义并使用了一个信号。记得连接这个信号到相应的槽函数以完成对象间的通信。

相关文章:
【Qt秘籍】[009]-自定义槽函数/信号
自定义槽函数 在Qt中自定义槽函数是一个直接的过程,槽函数本质上是类的一个成员函数,它可以响应信号。所谓的自定义槽函数,实际上操作过程和定义普通的成员函数相似。以下是如何在Qt中定义一个自定义槽函数的步骤: 步骤 1: 定义槽…...
HTTPS加密
一.加密是什么 加密就是把明文(要传输的信息)进行一系列的变换,生成密文. 有加密就有解密,解密就是把密文进行一系列的变换,生成明文. 在这个加密和解密过程中,往往需要一个或多个中间数据,辅助进行这个过程,这样的数据称为密钥. 加密解密到如今已经发展成了一个独立的学科 : 密…...
搭建大型分布式服务(三十八)SpringBoot 整合多个kafka数据源-支持protobuf
系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 本插件稳定运行上百个kafka项目,每天处理上亿级的数据的精简小插件,快速上手。 <dependency><groupId>io.github.vipjo…...
SpringBoot如何使用日志Logback,及日志等级详解
Spring Boot默认已经集成了SLF4J(Simple Logging Facade for Java)作为日志的接口,以及Logback作为日志的实现。这意味着在大多数情况下,你无需做额外的配置即可开始记录日志。 下面是一个简要的指南,包括如何在Spring…...
若依启动run-modules-system.bat报错问题解决方案
在启动run-modules-system.bat时遇到了一些问题,在网上搜索无果后,排查解决完毕 1.启动nacos时,报错如下 Error creating bean with name grpcClusterServer: Invocation of init method failed; nested exception is java.io.IOException: Failed to bind to address 0.0.0.0…...
Aws CodeCommit代码仓储库
1 创建IAM用户 IAM创建admin用户,增加AWSCodeCommitFullAccess权限 2 创建存储库 CodePipeline -> CodeCommit -> 存储库 创建存储库 3 SSH 1) window环境 3.1.1 上载SSH公有秘钥 生成SSH秘钥ID 3.1.2 编辑本地 ~/.ssh 目录中名为“config”的 SSH 配置文…...
PostgreSQL的内存参数
PostgreSQL的内存参数 基础信息 OS版本:Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本:16.2 pg软件目录:/home/pg16/soft pg数据目录:/home/pg16/data 端口:5777PostgreSQL 提供了多种内存参数&#x…...
【教程】在CentOS上使用Docker部署前后端分离项目的完整指南
当在CentOS上使用Docker部署前后端分离项目时,需要遵循一系列步骤来实现这一目标。以下是每个步骤的详细内容: 步骤1:安装Docker和Docker Compose 1.1 安装Docker 在CentOS上安装Docker,可以按照以下步骤进行: sudo yum install -y yum-utils device-mapper-persistent…...
某公司新招了个牛逼的架构师后.....
网友评论: 架构师一个响指之后。第二天,老板不见了走走停停 回头已是数月图片是我的故事没错了,本来我们组有10个人,我把代码重构之后,只要半个人维护,于是老板要裁掉9个>人,于是我被搞走了图…...
云计算和雾计算
雾计算作为传统集中式数据存储系统(云)和边缘设备之间的中间层。雾扩展了云,使计算和数据存储更接近边缘。雾由多个节点(雾节点)组成,并创建一个本地网络,使其成为一个去中心化的生态系统——雾…...
正缘画像 api数据接口
测测正缘画像,相貌特征,高矮胖瘦,黑白美丑,对方何许人也,远嫁近娶,何方定居,家庭观,持家爱家,生活质量,富裕贫穷,健康情况,测算结果仅…...
Java 基础面试300题 (171- 200)
Java 基础面试300题 (171- 200) 171.什么是同步? 当多个线程试图同时访问共享资源时,那么他们需要以某种方式让资源一次只能由一个线程访问。实现这一目标的过程被称为同步。Java提供了一个名为synchronized的关键字实现这一目标…...
0基础学习Elasticsearch-使用Java操作ES
文章目录 1 背景2 前言3 Java如何操作ES3.1 引入依赖3.2 依赖介绍3.3 隐藏依赖3.4 初始化客户端(获取ES连接)3.5 发送请求给ES 1 背景 上篇学习了0基础学习Elasticsearch-Quick start,随后本篇研究如何使用Java操作ES 2 前言 建议通篇阅读再回…...
【Linux】GNU编译器基础
文章目录 GCCMakefile、make GCC 常见的GNU编译器是GCC其包含gcc以及g等,适用于C/C中,在Windows系统中通常使用IDE进行程序的编写和编译、链接等操作,但在Linux系统中通常使用GNU编译器来进行,对于C/C等高级语言需要进行预编译、编…...
Linux 软件安装:从源码编译到包管理器安装
Linux 软件安装:从源码编译到包管理器安装 在 Linux 操作系统中,软件安装是一个非常重要的任务。不同的软件安装方式有不同的优缺点,本篇博客将介绍 Linux 软件安装的几种方式,包括从源码编译安装、使用包管理器安装和使用第三方…...
Python3 match-case 语句
前言 本文主要介绍match-case语句与switch-case的区别,及match-case语句的基本用法。 文章目录 前言一、switch-case 和match-case的区别二、match-case的基本用法1、可匹配的数据类型2、多条件匹配3、通配符匹配 一、switch-case 和match-case的区别 C语言里面s…...
图论第三天
似乎要团建了,我再猫会。我必须参与上团建再走。 130.被围绕的区域 先把外围的O变成A,再把飞地的O变成X,再把外围A变回O class Solution { public:int neighbor[4][2] {1,0,0,-1,-1,0,0,1};void solve(vector<vector<char>>&a…...
计算机网络学习2
文章目录 信道复用技术 第三章数据链路层概述数据链路层的三个重要问题封装成帧和透明传输差错检测可靠传输的相关基本概念可靠传输的实现机制停止等待协议回退N帧协议选择重传协议 点对点协议PPP共享式以太网网络适配器和MAC地址CSMA_CD协议的基本原理共享式以太网的争用期共享…...
unittest框架
目录 框架: unittest框架: 使用的原因: 核心要素(组成): TestCase测试用例: 可能出现的错误: TestSuite(测试套件): TestRunner(测试执行): 整体步骤: 查看执行结果: TestLoader测试加载: 方法级别Fixture: 类级别Fixture: 模块级别Fixture: 用例脚本…...
Python中的__str__和__repr__:揭示字符串表示的奥秘
标题:Python中的__str__和__repr__:揭示字符串表示的奥秘 摘要 在Python中,对象的字符串表示对于调试和日志记录至关重要。__str__和__repr__是两个特殊的方法,用于定义对象的字符串表示形式。尽管它们在功能上相似,…...
ArcSWAT建模踩坑记:你的土壤数据库参数算对了吗?聊聊SPAW的那些默认值和单位陷阱
ArcSWAT土壤参数校准实战:避开SPAW计算中的5个致命误区 当水文模拟结果与实测数据出现系统性偏差时,经验丰富的建模者会首先检查土壤参数——这个隐藏在界面背后的"沉默变量"往往是误差的最大来源。SPAW作为ArcSWAT推荐的土壤参数计算工具&…...
BG3ModManager:博德之门3模组管理终极解决方案
BG3ModManager:博德之门3模组管理终极解决方案 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. This is the only official source! 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager 你是否曾经为《博德之门3》的模组管理而烦…...
Ix开源平台:基于Kubernetes的私有云与家庭实验室一体化管理方案
1. 项目概述与核心价值最近在折腾一个叫Ix的开源项目,它来自ix-infrastructure这个组织。乍一看这个名字,你可能觉得有点抽象,但如果你对自托管、家庭实验室、私有云或者想找一个更现代、更易用的 TrueNAS 替代品感兴趣,那这个项目…...
告别showSoftInput失效:一文读懂Android 11+的WindowInsetsController输入法控制
Android输入法控制演进:从InputMethodManager到WindowInsetsController的深度解析 在移动应用开发中,输入法交互是最基础却又最容易被忽视的细节之一。许多开发者都曾遇到过这样的场景:精心设计的登录界面,光标在输入框闪烁&#…...
轻量级监控系统Monikhao:自托管部署与核心架构解析
1. 项目概述:一个轻量级、可自托管的监控解决方案最近在折腾个人服务器和家庭网络监控时,发现了一个挺有意思的项目:khaodius/monikhao。乍一看这个名字,可能会觉得有点陌生,但如果你对自建监控系统有需求,…...
AI助手API开发资源全指南:从入门到实战的宝藏清单
1. 项目概述:一个为AI助手API开发者量身打造的“藏宝图”如果你正在或打算基于OpenAI的Assistant API、Anthropic的Claude API,或是其他主流AI平台的助手接口来构建应用,那么你大概率会遇到一个经典困境:官方文档虽然详尽…...
基于Stable Diffusion与LoRA技术打造个人AI头像:从原理到实战
1. 项目概述:当AI开始“自拍”——SelfyAI的定位与核心价值最近在AI图像生成领域,一个名为SelfyAI的项目引起了我的注意。它不是一个简单的文生图工具,而是瞄准了一个非常具体且高频的需求:生成高质量、风格一致的个人AI头像。简单…...
数据流编排与异步任务调度中间件kelivo部署与实战指南
1. 项目概述与核心价值最近在折腾一个挺有意思的项目,叫“Chevey339/kelivo”。乍一看这个标题,可能有点摸不着头脑,它不像那些直接告诉你“XX管理系统”或“XX工具库”的项目名那么直白。但恰恰是这种看似神秘的命名,背后往往隐藏…...
湿版摄影×AI生成革命:为什么93%的MJ用户调不出真实碘化银斑痕?——资深暗房师+AI训练师双视角深度拆解
更多请点击: https://intelliparadigm.com 第一章:湿版摄影AI生成革命:为什么93%的MJ用户调不出真实碘化银斑痕?——资深暗房师AI训练师双视角深度拆解 湿版火棉胶摄影术诞生于1851年,其不可复制的物理噪点——由碘化…...
如何在Windows上无缝安装安卓应用:APK安装器终极指南
如何在Windows上无缝安装安卓应用:APK安装器终极指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾在电脑上羡慕安卓应用的便利,却苦…...
