【信号与槽机制】

信号与槽机制

  • 🌟 信号函数
  • 🌟 槽函数
  • 🌟 连接函数
  • 🌸 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;函数分布可…

Applied Spatial Statistics(五)线性回归 I

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

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;保障企业数据资产安全…

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

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

内容检索(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;开发中也非常常用。 为了满足…

# ERROR: node with name “rabbit“ already running on “MS-ITALIJUXHAMJ“ 解决方案

ERROR: node with name “rabbit” already running on “MS-ITALIJUXHAMJ” 解决方案 一、问题描述&#xff1a; 1、启动 rabbitmq-server.bat 服务时&#xff0c;出错 Error 2、查询 rabbitmqctl status 状态时&#xff0c;出错 Error 3、停止 rabbitmqctl stop 服务时&a…

关于画图-一次性搞定各类高级论文作图及配色

关于画图-一次性搞定各类高级论文作图及配色 图&#xff08;Figure&#xff09;可以让各类论文的结果更加直观&#xff0c;有时候一张图片比一大段文字更有说服力。 但许多新手作者可能会有一连串的疑惑&#xff1a;数据这么多&#xff0c;什么时候该做什么类型的图&#xff…

LabVIEW开发MOOG控制系统数据处理软件

LabVIEW开发MOOG控制系统数据处理软件 在现代航空领域&#xff0c;飞机结构的静强度试验是保证飞机安全运行的关键环节。MOOG加载控制系统作为试验中的关键设备&#xff0c;其数据输出的直观性和易处理性对于提高试验效率具有重要意义。设计了一种基于LabVIEW的MOOG控制系统数…

Pikachu 靶场 File Inclusion 通关解析

前言 Pikachu靶场是一种常见的网络安全训练平台&#xff0c;用于模拟真实世界中的网络攻击和防御场景。它提供了一系列的实验室环境&#xff0c;供安全专业人士、学生和爱好者练习和测试他们的技能。 Pikachu靶场的目的是帮助用户了解和掌握网络攻击的原理和技术&#xff0c;…

Android面试题之kotlin热流和channel

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点 于冷流不同&#xff0c;在垃圾回收之前&#xff0c;flow里的值都是存在内存之中&#xff0c;并且处于活跃状态 StateFlow StateFlow是一个状态容…

DSA理解理解蓝桥杯例题signature

一、历史 1991年8月&#xff0c;NIST&#xff08;Nation Institute of Standards and Technology&#xff0c;美国国家标准技术研究所&#xff09;提出了数字签名算法&#xff08;DSA&#xff09;用于他们的数字签名标准&#xff08;DSS&#xff09;中。 DSA是算法&#xff0c…

双向带头循环链表(图解)

文章目录 头节点(哨兵位)双向循环结构头插尾插头删尾删在指定位置之前插入数据删除指定位置之前的数据销毁链表 全部代码结语 单链表地址 头节点(哨兵位) 什么是头节点呢?头节点也叫哨兵节点,他在链表中进行不了任何操作,只是用来放哨用的,在单链表中我们当我们尾插的时候我们…