【信号与槽机制】

信号与槽机制

  • 🌟 信号函数
  • 🌟 槽函数
  • 🌟 连接函数
  • 🌸 QObejct::connect函数剖析
  • 🌟 官方文档中给出的定义
  • 🌟《Qt 5.9 C++开发指南》中的定义

在这里插入图片描述

🌟 信号函数

信号是一种特殊的成员函数,用于在特定事件发生时发出通知。一个类可以定义一个或多个信号,并在适当的时候发射(emit)这些信号。信号通常声明为 signals 关键字的一部分。

  • 范例:
    MyPushButton是一个自定义按钮控件类,继承于QPushButton。
class MyPushButton : public QPushButton
{Q_OBJECTexplicit  MyPushButton(QWidget *parent = nulltpr);
signals://声明信号关键字//点击信号,是Qt预定义提供的信号void clicked();//发送按钮名称信号,自定义的信号void sendBtnNameSignal(const QString &btnName);
};
  • 发信号需要使用一个关键字:emit
void MyPushButton::MyPushButton(QWidget *parent): QPushButton(parent)
{emit sendBtnNameSignal("btn");//在构造中发出发送按钮名称信号
}

🌟 槽函数

槽是普通的成员函数,用于响应信号。槽函数的特殊之处在于它们可以连接到一个或多个信号,以便在相关的信号被发射时被调用。

  • 范例:
    MyTextEdit是一个自定义富文本编辑控件类,继承于QTextEdit。
class MyTextEdit: public QTextEdit
{Q_OBJECT
//slots:是声明槽函数的关键字,public slots:表明这个一个公有成员槽函数
public slots:void SetBtnNameSlot(const QString &btnName);//设置按钮名称槽函数
};

🌟 连接函数

设置完信号函数和槽函数之后,它们还无法进行信息传递,还需要添加一个connect()函数,连接这两个不同类的成员函数。

  • 范例:
    MyWidget是一个自定义界面类,继承于QWidge。我在其中定义了一个MyPushButton 类和一个MyTextEdit类。
class MyPushButton;
class MyTextEdit;
class MyWidget: public QWidge
{Q_OBJECTexplicit MyWidget(QWidge *parent = nullptr){m_btn = new MyPushButton();m_text = new MyTextEdit();//前提:是QObject的子类,上一篇blog已经说过原因。//connec函数连接信号函数和槽函数connect(m_btn,&MyPushButton::sendBtnNameSignal,m_text,&MyTextEdit::SetBtnNameSlot,Qt::UniqueConnection);}
private :MyPushButton *m_btn = nullptr;MyTextEdit *m_text = nullptr;
};

通过设置连接函数,两个不同对象中的成员函数得以进行消息传递。

🌸 QObejct::connect函数剖析

✨函数原型:

[static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

通过传入指向发送者对象的指针和该对象的信号函数的地址以及指向接收者对象的指针和该对象的槽函数地址。

  • 通常,可以使用SIGNAL宏和SLOT宏将信号、槽函数包起来,这种写法要求至少写出信号函数和槽函数的传参类型。
  • 一个信号可以连接多个槽函数,同样,一个槽函数可以连接多个信号函数。
  • connect函数本身是线程安全的,但考虑到可能存在复杂的多线程环境,应当谨慎处理对象生存周期、跨线程连接和多线程并发访问等问题。
  • 关于第五个参数Qt::ConnectionType,缺省情况下会使用Qt::AutoConnection.这个参数决定了接收到信号后是立即执行槽函数,还是排队执行槽函数。
ConnectionType				  Value 			Description
Qt::AutoConnection 				0				(默认值)如果接收器存放在发出信号的线程中,则使用QT :: DirectConnection。否则,使用QT :: QueuedConnection。发射信号时确定连接类型。
Qt::DirectConnection			1				槽函数会在信号发出被响应时立即执行,并且,槽函数会被放在信号线程中执行。
Qt::QueuedConnection			2				当信号发射时,槽函数的调用请求会被放入接收对象所在线程的事件队列中,等待事件循环处理。适用于跨线程通信。
Qt::BlockingQueuedConnection	3				与qt :: QueuedConnection相同,只是信号函数会阻塞直到槽函数返回。如果接收者对象和发送者对象在同一个线程中,则不得使用此连接,否则应用程序将死锁。
Qt::UniqueConnection			0x80			用于确保信号与槽之间的连接是唯一的。如果已经存在相同的信号与槽连接,再次使用 Qt::UniqueConnection 连接时,连接操作将会失败,从而避免建立重复的连接
  • 如果在消息传递时使用了自定义的数据类型,需要先将该类型注册到元对象系统中,否则connect会失败。
//注册QVector<AgendaInfo>到元类型中
qRegisterMetaType<QVector<AgendaInfo>>("QVector<AgendaInfo>");

✨函数原型:

[static] QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection)
  • 这个函数原型中,支持将信号发送给一个QObejct的类的成员函数,并且在连接时无需列出函数的传参类型,Qt会为你去做检查的工作。
  • 因此,这个函数原型可以支持将匿名函数(lambda)作为连接的槽函数。
 QObject::connect(socket, &QTcpSocket::connected, this, [=] () {socket->write("GET " + page + "\r\n");}, Qt::AutoConnection);
  • Note: Qt::UniqueConnections do not work for lambdas, non-member functions and functors; they only apply to connecting to member functions.[译文]:Qt::UniqueConnections 这种连接方式不支持用于连接槽函数为匿名函数、非成员函数,connect函数会报错。

🌟 官方文档中给出的定义

Signals and slots are used for communication between objects. The signals and slots mechanism is a central feature of Qt and probably the part that differs most from the features provided by other frameworks. Signals and slots are made possible by Qt's meta-object system. [译文]:信号和插槽用于对象之间的通信。信号和插槽机制是QT的主要特征,可能是与其他框架提供的功能不同的部分。信号和插槽通过QT的元对象系统使其成为可能。

🌟《Qt 5.9 C++开发指南》中的定义

Qt 使用信号与槽的机制实现对象间通信,它隐藏了复杂的底层实现,完成信号与槽的关联后,发射信号时并不需要知道Qt是如何找到槽函数的。Qt信号与槽机制与 Delphi 和 C++ Builder 的“事件一一响应” 较类似,但是更加灵活。
某些开发架构使用回调函数(callback)实现对象间通信。与回调函数相比,信号与槽的执行速度稍微慢 ,因为需要查找连接的对象和槽函数 ,但是这种区别在应用程序运行时是感觉不到的,而其提供的灵活性却比回调函数强很多。

在这里插入图片描述

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

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

相关文章

2024数维杯数学建模C题思路代码

2024年数维杯&电工杯思路代码在线文档​https://www.kdocs.cn/l/cdlol5FlRAdE 这道题想要做出好的结果&#xff0c;必须要结合插值法和分布函数来做&#xff0c;主要还是因为勘探点太少&#xff0c;直接用插值法效果不太好&#xff0c;以下是我做的&#xff0c;函数分布可…

Spring boot使用一个接口实现任意一张表的增删改查

Spring boot使用一个接口实现任意一张表的增删改查 文章目录 Spring boot使用一个接口实现任意一张表的增删改查0、讲解部分1、准备工作2、代码实现前后端对接包装类model部分ControllerServiceMapperMapper的xml部分 本文旨在&#xff1a; &#xff08;需要做额外的操作创建对…

Applied Spatial Statistics(五)线性回归 I

Applied Spatial Statistics&#xff08;五&#xff09;线性回归 I 该笔记本演示了&#xff1a; 线性回归系数估计在假设下是无偏的如何围绕系数估计构建 bootstrap 置信区间残差图Q-Q图 1. 线性回归系数估计在假设下是无偏的 import numpy as np import matplotlib.pyplot…

C# 集合(五) —— Dictionary类

总目录 C# 语法总目录 集合五 Dictionary 1. Dictionary 1. Dictionary 字典是键值对集合&#xff0c;通过键值对来查找 Dictionary和Hashtable的区别是Dictionary可以用泛型&#xff0c;而HashTable不能用泛型 OrderedDictionary 是按照添加元素时的顺序的字典&#xff0c;是…

5分钟速通大语言模型(LLM)的发展与基础知识

✍️ 作者&#xff1a;哈哥撩编程&#xff08;视频号同名&#xff09; 博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 &#x1f3c6; 推荐专栏&#xff1a; &#x1f3c5; 程序员&#xff1a;职场关键角色通识宝…

N5183B是德科技n5183b信号源

181/2461/8938产品概述&#xff1a; 简  述&#xff1a; N5183B 频率范围&#xff1a;9 kHz 至 20 GHz&#xff0c;具有 AM、FM、相位调制功能。N5183B MXG X 系列微波模拟信号发生器拥有 9 kHz 至 40 GHz 的频率覆盖范围&#xff0c;以及接近 PSG 级别的相位噪声性能&…

3588 pwm android12 的操作

问题&#xff1a; 客户需要在android12 的界面上操作板卡上的 PWM 蜂鸣器设备。 过程&#xff1a; 1 了解一下 3588 android12 源码的 关于PWM 的驱动。 设备树找不到 pwm 但是&#xff0c; 还不知道&#xff0c;android12 最终包含的 设备树是哪个&#xff0c;但是经过我的…

ctfshow SSRF 351-358

做题前,需要先学习关于ssrf漏洞的相关知识 小注意: 当使用 file_get_contents() 函数访问远程 URL 时&#xff0c;它会尝试获取该 URL 指向的资源的内容&#xff0c;并将内容以字符串的形式返回。 如果 b.php 文件是一个 PHP 文件&#xff0c;它包含的内容取决于该 PHP 文件…

素数伴侣最大组合数

若两个正数之和为素数&#xff0c;则这两个数称之为“素数伴侣”。利用此特性找出给定数组中最大的“素数伴侣”对数。 (笔记模板由python脚本于2024年05月11日 18:17:40创建&#xff0c;本篇笔记适合熟悉基本编程且了解素数的coder翻阅) 【学习的细节是欢悦的历程】 Python 官…

阿里云ECS服务器实例挂载数据盘步骤(磁盘自动挂载.、访问挂载点)

阿里云ECS服务器实例挂载数据盘步骤 相关指令 df -h 查看磁盘空间 du -sh * 查看使用内存大小1.磁盘自动挂载 首先登录阿里云ECS服务器&#xff0c;通过 df -h 命令查看当前磁盘挂载情况 通过 fdisk -l 命令查看磁盘情况&#xff0c;可以发现有两个盘&#xff1a; 系统盘 …

绍兴ISO27001认证:信息安全认证的金钥匙

&#x1f308;&#x1f308;绍兴ISO27001认证&#xff1a;✌️信息安全认证的金钥匙&#x1f511; &#x1f498;随着信息技术的飞速发展&#xff0c;&#x1f481;信息安全问题日益凸显。&#x1f510;为了提升信息安全管理水平&#xff0c;&#x1f46e;保障企业数据资产安全…

2024OD机试卷-绘图机器 (java\python\c++)

题目:绘图机器 题目描述 绘图机器的绘图笔初始位置在原点(0,0)机器启动后按照以下规则来进行绘制直线。 尝试沿着横线坐标正向绘制直线直到给定的终点E期间可以通过指令在纵 坐标轴 方向进行偏移,offsetY为正数表示正向偏移,为负数表示负向偏移 给定的横坐标终点值E 以及若…

python使用elasticserch进行混合搜索构建知识库

python使用elasticserch进行混合搜索 基于python使用elasticserch安装elasticsearch连接elasticsearch创建索引写入数据搜索数据关键字搜索KNN搜索向量搜索混合搜索 基于python使用elasticserch 安装elasticsearch pip install elasticsearch连接elasticsearch es_username …

神经网络复习--神经网络算法模型及BP算法

文章目录 神经网络模型的构成BP神经网络 神经网络模型的构成 三种表示方式&#xff1a; 神经网络的三要素&#xff1a; 具有突触或连接&#xff0c;用权重表示神经元的连接强度具有时空整合功能的输入信号累加器激励函数用于限制神经网络的输出 感知神经网络 BP神经网络 …

解释Java中的泛型通配符和泛型方法

泛型通配符&#xff08;Wildcard&#xff09; Java 中的泛型通配符 ? 使用在泛型类型的声明中&#xff0c;表示未知的类型参数。通配符通常用在参数、字段、局部变量或者返回类型上&#xff0c;为泛型带来了更高的灵活性。泛型通配符主要分为三种形式&#xff1a; 无界通配符…

GO: json 处理

需要引入"encoding/json"包 json解析到map jsonStr : "{\"a\":\"test\",\"b\":\"testb\"}" var dat map[string]string err : json.Unmarshal([]byte(jsonStr), &dat) if err nil {fmt.Println(dat) }结果…

内容检索(2024.05.12)

随着创作数量的增加&#xff0c;博客文章所涉及的内容越来越庞杂&#xff0c;为了更为方便地阅读&#xff0c;后续更新发布的文章将陆续在此汇总并附上原文链接&#xff0c;感兴趣的小伙伴们可持续关注文章发布动态&#xff01; 本期更新内容&#xff1a; 1. 信号仿真类话题-…

webpack5基础和配置

初步体验webpack打包 webpack是一个静态资源打包工具。 它会以一个或多个文件作为打包的入口&#xff0c;将我们整个项目所有文件编译组合成一个或多个文件输出出去。 输出的文件就是编译好的文件&#xff0c;就可以在浏览器段运行了。 1.初始化最简单的一个目录文件&#xff…

JavaSE——集合框架一(1/7)-集合体系概述(集合体系结构,Collection集合体系)、Collection的常用方法(介绍,实例演示,代码)

目录 集合体系概述 集合体系结构 Collection集合体系 Collection的常用方法 介绍 实例演示 完整代码 集合体系概述 集合体系结构 集合是一种容器&#xff0c;用来装数据的&#xff0c;类似于数组&#xff0c;但集合的大小可变&#xff0c;开发中也非常常用。 为了满足…

element-ui 中 如何在el-upload的移除文件列表事件 on-remove 中调用后端进行数据库的删除。

问题描述&#xff1a; 刚开始的时候我设置的是实时上传&#xff1a; auto-upload"true", :http-request"uploadResource"绑定的这个方法就去后端进行实时上传附件了&#xff0c;这个时候就已经保存到数据库。 那么问题来了&#xff1a; :on-remove"…