Qt_自定义信号
目录
1、自定义信号的规定
2、创建自定义信号
3、带参数的信号与槽
4、一个信号连接多个槽
5、信号与槽的断开
结语
前言:
虽然Qt已经内置了大量的信号,并且这些信号能够满足大部分的开发场景,但是Qt仍然允许开发者自定义信号,给开发者提供了足够的DIY设计空间。
1、自定义信号的规定
Qt中的信号实际上就是函数,因此自定义信号本质就是自定义函数,只不过自定义信号函数的写法要遵循以下三点:
1、Qt提供了关键字“signals”,自定义信号函数必须写在 “signals” 关键字下边。
2、自定义信号函数只需要声明,不需要实现,返回值要为void。
3、自定义信号函数可以有形参,允许重载。
当然,有了自定义信号函数后还需要拥有将该信号发出的能力,可以使用emit关键字修饰信号函数,表示发送该信号。"emit" 是⼀个空的宏。
2、创建自定义信号
有了上述的规则后,可以手动创建一个自定义信号,并给该信号连接一个槽函数,槽函数内打印一条语句,运行代码后若输出窗口中打印出了语句说明自定义信号成功创建,具体代码如下。
1、widget.h的代码如下:
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTsignals:void mySignal();//自定义信号public:Widget(QWidget *parent = nullptr);~Widget();void Print();//槽函数声明private:Ui::Widget *ui;
};
#endif // WIDGET_H
2、widget.cpp的代码如下:
#include "widget.h"
#include "ui_widget.h"#include <QDebug>
#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(this,&Widget::mySignal,this,&Widget::Print);//连接信号与槽emit mySignal();//发送信号
}Widget::~Widget()
{delete ui;
}void Widget::Print()
{qDebug()<<"自定义信号调用的自定义槽函数";
}
运行结果:

从结果可以看到,槽函数里的语句被打印,说明自定义信号成功被触发且执行了对应的槽函数。
3、带参数的信号与槽
Qt中的信号与槽在代码的层面上都是函数,既然是函数所以他们都可以有形参,不过严格规定信号的参数要与连接的槽的参数类型保持一致,信号的参数多于槽参数都是可以的。当发送该信号时,调用信号所传的实参会传给信号函数的形参,然年信号函数再传递给槽函数,示意图如下:

代码实现如下,1、widget.h的代码如下:
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTsignals:void mySignal(QString s);//自定义信号public:Widget(QWidget *parent = nullptr);~Widget();void Print(QString s);//槽函数声明private:Ui::Widget *ui;
};
#endif // WIDGET_H
2、widget.cpp的代码如下:
#include "widget.h"
#include "ui_widget.h"#include <QDebug>
#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(this,&Widget::mySignal,this,&Widget::Print);//连接信号与槽emit mySignal("这是一个带有参数的信号");//发送信号
}Widget::~Widget()
{delete ui;
}void Widget::Print(QString s)
{qDebug()<<s;
}
测试结果:

4、一个信号连接多个槽
上述的例子中是一个信号连接一个槽函数,因此当发送该信号时会调用一次槽函数。那么当一个信号连接多个槽函数时,发送该信号时具体的调用方式是什么呢?代码测试如下。

1、widget.h的代码如下:
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTsignals:void mySignal(QString s);//自定义信号public:Widget(QWidget *parent = nullptr);~Widget();void Print(QString s);//槽函数声明1void Print2(QString s);//槽函数声明2private:Ui::Widget *ui;
};
#endif // WIDGET_H
2、widget.cpp的代码如下:
#include "widget.h"
#include "ui_widget.h"#include <QDebug>
#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(this,&Widget::mySignal,this,&Widget::Print);//连接信号与槽connect(this,&Widget::mySignal,this,&Widget::Print2);//连接信号与槽emit mySignal("这是一个带有参数的信号");//发送信号
}Widget::~Widget()
{delete ui;
}void Widget::Print(QString s)
{qDebug()<<s+"槽函数1";
}void Widget::Print2(QString s)
{qDebug()<<s+"槽函数2";
}
测试结果:

结果是当一个信号连接多个槽时,发送该信号会调用所有连接的槽的函数,侧面也反映出不仅仅是一个信号可以连接多个槽,一个槽也可以被多个信号连接,只不过这种方式的逻辑就和单个信号连接单个槽的逻辑一样,这里就不再展示代码了。
5、信号与槽的断开
使⽤disconnect函数即可完成断开,disconnect的⽤法和connect相似,disconnect的形参和connect是一样的,即连接的逻辑和断开的逻辑是一样的。比如在上述代码中,一个信号连接了两个槽函数,使用disconnect函数断开与其中一个槽函数的连接,那么发送信号时只会执行一个槽函数,测试结果如下:

从结果可以看到,只执行了一个槽函数。
结语
以上就是关于自定义信号的讲解,自定义信号虽然用的不多,但是其延申出来的知识可以帮助我们进一步理解信号与槽的细节。
最后如果本文有遗漏或者有误的地方欢迎大家在评论区补充,谢谢大家!!
相关文章:
Qt_自定义信号
目录 1、自定义信号的规定 2、创建自定义信号 3、带参数的信号与槽 4、一个信号连接多个槽 5、信号与槽的断开 结语 前言: 虽然Qt已经内置了大量的信号,并且这些信号能够满足大部分的开发场景,但是Qt仍然允许开发者自定义信号&#…...
【运维方案】某系统运维需求方案参考(doc全原件2024)
系统运维需求方案 1服务目标 2服务人力需求、服务资源需求 3信息资产统计服务需求 4业务应用软件服务需求 5网络、安全系统运维服务需求 6主机、存储系统运维服务需求 7数据库系统运维服务需求 8终端运维服务需求 9综合布线系统服务需求 10大屏幕显示系统的维护需求 11视频会议…...
Linux环境使用Git同步教程
📖 前言:由于CentOS 7已于2024年06月30日停止维护,为了避免操作系统停止维护带来的影响,我们将把系统更换为Ubuntu并迁移数据,在此之前简要的学习Git的上传下载操作。 目录 🕒 1. 连接🕘 1.1 配…...
c++临时对象导致的生命周期问题
对象的生命周期是c中非常重要的概念,它直接决定了你的程序是否正确以及是否存在安全问题。 今天要说的临时变量导致的生命周期问题是非常常见的,很多时候没有一定经验甚至没法识别出来。光是我自己写、review、回答别人的问题就犯了或者看到了许许多多这…...
CSP-J 算法基础 深度优先搜索
文章目录 前言深度优先搜索通俗解释例子深度优先搜索的步骤DFS 的特点生活中的类比 为什么递归问题会变成深度优先搜索?递归与深度优先搜索的关系:递归与系统栈递归调用的过程:栈的作用: 递归与系统栈的简单示例递归实现 DFS 的简…...
LeetCode题练习与总结:基本计算器 Ⅱ--227
一、题目描述 给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 你可以假设给定的表达式总是有效的。所有中间结果将在 [-2^31, 2^31 - 1] 的范围内。 注意:不允许使用任何将字符串作为数学表达式计算…...
Elasticsearch基础(七):Logstash如何开启死信队列
文章目录 Logstash如何开启死信队列 一、确保 Elasticsearch 输出插件启用 DLQ 支持 二、配置 Logstash DLQ 设置 三、查看死信队列 四、排查 CSV 到 Elasticsearch 数据量不一致的问题 Logstash如何开启死信队列 在 Logstash 中,死信队列(Dead Le…...
c语言--力扣简单题目(链表的中间节点)讲解
题目如下: 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:head [1,2,3,4,5] 输出:[3,4,5] 解释:链表只有一个中间结点…...
【STM32 Blue Pill编程】-定时器计数模式
定时器计数模式 文章目录 定时器计数模式1、定时器计数模式介绍2、硬件准备及接线3、模块配置3.1 定时器计数模式配置3.2 定时器中断配置3.3 串口配置4、代码实现在本文中,我们将讨论如何在计数器模式下配置 STM32 Blue Pill 定时器模块。 要将定时器用作计数器,我们将其配置…...
【例题】lanqiao1331 二进制中 1 的个数
二进制中 1 的个数 题目描述 给定一个整数 x,输出该数二进制表示中 1 的个数。 例:9 的二进制表示为 1001,有 2 位是 1 ,所以函数返回 2。 输入描述 输入 x (内存空间为 32 位的整数)。 输出描述 第一…...
【论文解读】图像序列识别:CRNN技术在场景文本识别中的应用与突破(附论文地址)
论文地址:https://arxiv.org/pdf/1507.05717 这篇文章的标题是《An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition》,作者是Baoguang Shi, Xiang Bai和Cong Yao,…...
Vue3+CesiumJS相机定位camera
new Cesium.Camera (scene) 摄像机由位置,方向和视锥台定义。 方向与视图形成正交基准,上和右视图x上单位矢量。 视锥由6个平面定义。每个平面都由 Cartesian4 对象表示,其中x,y和z分量定义垂直于平面的单位矢量,w分量…...
turbo译码算法MAX, MAX_SCALE and MAX_STAR的比较
在Turbo码的译码算法中,MAX、MAX_SCALE和MAX_STAR是涉及对数似然比(LLR)计算时,对MAP(最大后验概率)算法或其变种Log-MAP算法中分支度量计算的几种不同处理方式。下面是对这三种方法的比较: 1.…...
关于HarmonyOS的学习
day31 购物车案例 一、加入购物车 1、点击按钮后,把当前这个列表的数据拿到,应该存储到一个数组里面 --- 数据结构,把数据存储进行数组2、假如已经把所有的数据添加数组完毕,最终应该存储进购物车里面,所谓的购物车说…...
【雅特力AT32】搭建模板工程及GPIO点灯操作
目录 AT32模板工程建立及点灯操作 建立AT32模板工程 AT32点灯操作 LED原理图GPIO寄存器LED源码分析 建立AT32模板工程 从0到编译运行详细搭建保姆教程: 【雅特力AT32】Keil 环境:搭建标准库模板工程、使用 AT-Link、Debug 里选择 CMSIS-DAP调试器 下面做…...
实战千问2大模型第三天——Qwen2-VL-7B(多模态)视频检测和批处理代码测试
画面描述:这个视频中,一位穿着蓝色西装的女性站在室内,背景中可以看到一些装饰品和植物。她双手交叉放在身前,面带微笑,似乎在进行一场演讲或主持活动。她的服装整洁,显得非常专业和自信。 一、简介 阿里通义千问开源新一代视觉语言模型Qwen2-VL。其中,Qwen2-VL-72B在大…...
数据库索引底层数据结构之B+树MySQL中的页索引分类【纯理论干货,面试必备】
目录 1、索引简介 1.1 什么是索引 1.2 使用索引的原因 2、索引中数据结构的设计 —— B树 2.1 哈希 2.2 二叉搜索树 2.3 B树 2.4 最终选择之——B树 2.4.1 B树与B树的对比(面向索引)【面试题】 3、MySQL中的页 3.1 页的使用原因 3.2 页的结构 3.2.1 页文件头和页文件…...
编译QT源码时的configure参数须知
文章目录 一、configure help原文二、configure help机译三、features 执行命令得到configure帮助文件 qtsrc/configure --help一、configure help原文 Usage: configure [options] [-- cmake-options]This is a convenience script for configuring Qt with CMake. Options…...
如何利用人工智能大模型来进行数字化营销?
这是一本关于如何利用人工智能大模型来进行数字化营销并驱动业绩增长的书。人工智能大模型是指那些具有超大规模的参数和数据的人工智能模型,它们能够在各种复杂的任务上表现出惊人的能力。 在本书中,你将学习到如何在电商、广告和用户增长等数字化营销业…...
【MRI基础】回波序列长度-echo train length ETL概念
回波序列长度 回波序列长度 (echo train length, ETL) 是磁共振成像 (MRI) 中的一个重要参数,它对图像采集时间和图像质量有显著影响。ETL 是指在单个激励脉冲之后的 MRI 序列中采集的回波数量。通过增加 ETL,可以在一个重复时间 (TR) 内收集多个回波&a…...
从DVWA存储型XSS看Web安全:开发者常踩的坑与Impossible级别的启示
从DVWA存储型XSS看Web安全:开发者常踩的坑与Impossible级别的启示 在Web应用开发中,安全漏洞就像隐藏在代码中的定时炸弹,而存储型XSS(跨站脚本攻击)无疑是其中最具破坏力的一种。不同于反射型XSS的一次性攻击…...
【独家首发】Polars 2.0 vs Pandas 2.2清洗基准测试:10亿行CSV清洗仅耗11.3秒?真相在此
第一章:Polars 2.0大规模数据清洗的范式跃迁Polars 2.0 不再是 Pandas 的轻量替代品,而是一次面向现代硬件与真实业务场景的数据处理范式重构。其核心跃迁体现在零拷贝内存布局、全链路惰性执行引擎(LazyFrame)与原生支持的并行流…...
小白必看!收藏这份Agent思维链技术指南,轻松入门大模型世界
小白必看!收藏这份Agent思维链技术指南,轻松入门大模型世界 本文深入解析了Agent模型中的思维链技术,介绍了不同模型如Claude、Gemini等对思维链的不同称谓及其核心原理,即通过将思考内容带入上下文来提升多轮推理性能。文章对比了…...
【国家级等保2.0合规必读】:Python扩展模块安全开发规范(含12项强制检查项+自动化检测脚本)
第一章:Python扩展模块安全开发概述Python 扩展模块(C/C 编写的 .so/.dll 文件)是提升性能、复用底层库或与系统交互的关键手段,但其直接操作内存、绕过 Python 运行时保护机制的特性,也使其成为安全风险的高发区。开发…...
3步释放华硕笔记本潜能:G-Helper轻量化控制工具的极致优化指南
3步释放华硕笔记本潜能:G-Helper轻量化控制工具的极致优化指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models …...
零基础快速上手:免费开源H5编辑器h5maker完全指南
零基础快速上手:免费开源H5编辑器h5maker完全指南 【免费下载链接】h5maker h5编辑器类似maka、易企秀 账号/密码:admin 项目地址: https://gitcode.com/gh_mirrors/h5/h5maker 想要轻松制作专业级H5页面却苦于技术门槛?h5maker作为一…...
别再只会用PS修图了!用Python的Richardson-Lucy算法,5分钟搞定模糊老照片修复
用Python拯救模糊老照片:零基础也能上手的Richardson-Lucy算法实战 翻箱倒柜找到一张泛黄的老照片,却发现画面模糊得连人脸都看不清?别急着叹气,更不用花大价钱找专业修图师。今天我要分享一个连Python新手都能轻松上手的黑科技—…...
ESP32上给LVGL做个‘懒加载’:分页与动态读取大文本的实战对比(附代码)
ESP32上LVGL大文本显示优化:分页加载与动态读取的深度对比与实践 在嵌入式设备上处理大文本显示一直是开发者面临的挑战之一。当我们在ESP32这样的资源受限平台上使用LVGL(Light and Versatile Graphics Library)显示超长文本时,如…...
DAMOYOLO-S效果展示:低光照、模糊、遮挡图像下的鲁棒检测能力
DAMOYOLO-S效果展示:低光照、模糊、遮挡图像下的鲁棒检测能力 1. 引言:当目标检测遇上“坏天气” 想象一下,你正在开发一个智能安防摄像头系统,或者一个自动驾驶的视觉模块。白天光线充足、画面清晰的时候,一切都很完…...
【架构师老王】AI真的在“杀死”软件吗?从系统烟囱到Agent时代的非侵入式重构
摘要 近期,“AI杀死软件”的论调在硅谷和国内技术圈闹得沸沸扬扬。作为一名在企业架构领域摸爬滚打15年的老兵,我见证了从单机版到SOA,再到微服务与云原生的每一次浪潮。客观来讲,AI杀死的并不是“软件”本身,而是那些…...
