c++实现Qt信号和槽机制
文章目录
- 简介
- 信号
- 槽
- 信号与槽的连接
- 特点
- 观察者模式
- 定义
- 观察者模式结构图
- 实现简单的信号和槽
简介
信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁。
信号和槽机制是 Qt 的核心机制,可以让编程人员将互不相关的对象绑定在一起,实现对象之间的通信。
信号
当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用。
槽
用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且对象并不了解具体的通信机制。
信号与槽的连接
所有从 QObject 或其子类 ( 例如 Qwidget ) 派生的类都能够包含信号和槽。因为信号与槽的连接是通过 QObject 的 connect() 成员函数来实现的。
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
其中 sender 与 receiver 是指向对象的指针,SIGNAL() 与 SLOT() 是转换信号与槽的宏。
特点
1、一个信号可以连接多个槽
当信号发射时,会以不确定的顺序一个接一个的调用各个槽。
2、多个信号可以连接同一个槽
即无论是哪一个信号被发射,都会调用这个槽。
3、信号直接可以相互连接
发射第一个信号时,也会发射第二个信号。
4、连接可以被移除
这种情况用得比较少,因为在对象被删除时,Qt会自动移除与这个对象相关的所有连接。语法如下:
disconnect(sender, SIGNAL(signal), receiver, SLOT(slot));
观察者模式
定义
观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
观察者模式结构图

在观察者模式中有如下角色:
1、Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
2、ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
3、Observer:抽象观察者,是观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。
4、ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。
实现简单的信号和槽
为什么要说观察者模式呢?因为Qt的信号和槽就是基于这种设计模式来进行设计的。通过信号和槽将对发送者信号感兴趣的对象连接起来,当发送者的信号发送的时候,就会对这个列表进行遍历,这种方式类似于广播,不关心用户是否收到,只是进行发送而已。下面是实现方式。
#include <iostream>
#include <vector>
using namespace std;//槽函数类
template <class TParam>
class SlotBase
{
public:virtual void slotFuntion(TParam) = 0;virtual ~SlotBase() = default;
};template <class TReceiver,class TParam>
class Slot:public SlotBase<TParam>
{
private:TReceiver *m_preveiver;void (TReceiver::*m_func)(TParam);
public:Slot(TReceiver * reveiver,void(TReceiver::*func)(TParam)){m_preveiver = reveiver;m_func = func;}void slotFuntion(TParam param) override{(m_preveiver->*m_func)(param);}
};//信号类
template <class TParam>
class Signal
{
private:std::vector<SlotBase<TParam> *> signal_vector;
public:template <class TReceiver>void addSlot(TReceiver *reveiver,void(TReceiver::*func)(TParam)){signal_vector.push_back(new Slot(reveiver,func));}void operator()(TParam param){for(SlotBase<TParam> *p:signal_vector){p->slotFuntion(param);}}
};//两个测试的接受信号类
class Receiver1
{
public:void func1(int param){std::cout<<"这是Receiver1类中方法,参数为"<<param<<endl;}
};class Receiver2
{
public:void func2(int param){std::cout<<"这是Receiver2类中方法,参数为"<<param<<endl;}
};class SendObj
{
public:Signal<int> valueChanged;
public:void testSend(int value){valueChanged(value);}
};#define connect(send,signal,reveiver,slot) send->signal.addSlot(reveiver,slot)int main()
{SendObj *send=new SendObj;Receiver1 *r1 = new Receiver1;Receiver2 *r2 = new Receiver2;connect(send,valueChanged,r1,&Receiver1::func1);connect(send,valueChanged,r2,&Receiver2::func2);send->testSend(100);return 0;
}

相关文章:
c++实现Qt信号和槽机制
文章目录 简介信号槽信号与槽的连接 特点观察者模式定义观察者模式结构图 实现简单的信号和槽 简介 信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁。 信号和槽机制是 Qt 的核心…...
【Linux】五、进程
一、冯诺依曼体系结构 存储器:指的是内存; 输入设备:键盘、摄像头、话筒,磁盘,网卡; 输出设备:显示器、音响、磁盘、网卡; 中央处理器(CPU):运算器…...
使用 OpenCV 和 Python 卡通化图像-附源码
介绍 在本文中,我们将构建一个有趣的应用程序,它将卡通化提供给它的图像。为了构建这个卡通化器应用程序,我们将使用 python 和 OpenCV。这是机器学习令人兴奋的应用之一。在构建此应用程序时,我们还将了解如何使用 easygui、Tkinter 等库。在这里,您必须选择图像,然后应…...
GitLab不同角色对应的权限
Owner(拥有者): 拥有者是项目或组的创建者,拥有最高级别的权限。他们可以添加、删除项目成员,修改项目设置,管理访问权限,并进行项目转让。在组级别,他们还可以添加或删除子组和项目…...
手写一个简易的布隆过滤器
1.什么是布隆过滤器 布隆过滤器(Bloom Filter)是1970年由布隆(人名)提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,…...
阿里云快速部署开发环境 (Apache + Mysql8.0)
本文章的内容截取于云服务器管理控制台提供的安装步骤,再整合前人思路而成,文章末端会提供原文连接 ApacheMysql 8.0部署MySQL数据库(Linux)步骤一:安装MySQL步骤二:配置MySQL步骤三:远程访问My…...
侧边栏的打开与收起
侧边栏的打开与收起 <template><div class"box"><div class"sideBar" :class"showBox ? : controller-box-hide"><div class"showBnt" click"showBox!showBox"><i class"el-icon-arrow-r…...
贝叶斯学习
贝叶斯 贝叶斯学习的背景贝叶斯定理举例 概览选择假设— MAPMAP举例 选择假设 — 极大似然 MLML 举例: 抛硬币问题 极大似然 & 最小二乘Nave Bayesian Classifier (朴素贝叶斯分类器)举例1:词义消歧 (Word Sense Disambiguation)举例 2: 垃圾邮件过滤 从垃圾邮件…...
Java并发系列之六:CountDownLatch
CountDownLatch作为开发中最常用的组件,今天我们来聊聊它的作用以及内部构造。 首先尝试用一句话对CountDownLatch进行概括: CountDownLatch基于AQS,它实现了闩锁,在开发中可以将其用作任务计数器。 若想要较为系统地去理解这些特性ÿ…...
24数据结构-图的基本概念与存储结构
目录 第六章 图6.1 图的基本概念知识回顾 6.2 图的储存结构(邻接矩阵法)1. 数组表示法(1) 有向图,无向图的邻接矩阵 2. 定义邻接矩阵的结构3. 定义图的结构4. 构造图G5. 特点 第六章 图 6.1 图的基本概念 图是一种非线性结构 图的特点&am…...
自然语言处理学习笔记(三)————HanLP安装与使用
目录 1.HanLP安装 2.HanLP使用 (1)预下载 (2)测试 (3)命令行 (4)测试样例 3.pyhanlp可视化 4. HanLP词性表 1.HanLP安装 HanLP的 Python接口由 pyhanlp包提供,其安装…...
CS 144 Lab Five -- the network interface
CS 144 Lab Five -- the network interface TCP报文的数据传输方式地址解析协议 ARPARP攻击科普 Network Interface 具体实现测试tcp_ip_ethernet.ccTCPOverIPv4OverEthernetAdapterTCPOverIPv4OverEthernetSpongeSocket通信过程 对应课程视频: 【计算机网络】 斯坦福大学CS144…...
Mecha
一、Mecha Mecha 是一个开源的多云 Kubernetes 管理平台,旨在简化和统一在多个云提供商上运行 Kubernetes 集群的管理和操作。它是由阿里巴巴集团开发和维护的项目。 Mecha 的主要目标是提供一个统一的界面和工具,使用户能够更轻松地在不同的云提供商上…...
Apache RocketMQ之集成RocketMQ_MQTT 安装部署协议
Apache RocketMQ 安装说明 安装步骤 参考快速开始 https://rocketmq.apache.org/zh/docs/quickStart/01quickstart 安装可视化rocketmq_dashboard下载地址 https://rocketmq.apache.org/zh/docs/4.x/deployment/03Dashboard/ 安装rocketmq_mqtt https://rocketmq.apache.o…...
Oracle多行数据合并为一行数据,并将列数据转为字段名
Oracle多行数据合并为一行数据 实现查询效果原数据 方式一:MAX()数据效果SQL 方式二:LISTAGG()数据效果 方式三:WM_CONCAT()数据效果 实现查询效果 原数据 FZPROJECTVALUE1电脑$16001手机$121导管$12电脑$22手机$22 方式一:MAX…...
MySQL5.7 与 MariaDB10.1 审计插件兼容性验证
这是一篇关于发现 MariaDB 审计插件导致 MySQL 发生 crash 后,展开适配验证并进行故障处理的文章。 作者:官永强 爱可生DBA 团队成员,擅长 MySQL 运维方面的技能。热爱学习新知识,亦是个爱打游戏的宅男。 本文来源:原创…...
PyTorch Lightning教程五:Debug调试
如果遇到了这样一个问题,当一次训练模型花了好几天,结果突然在验证或测试的时候崩掉了,这个时候其实是很奔溃的,主要还是由于没有提前知道哪些时候会出现什么问题,本节会引入Lightning的Debug方案 1.fast_dev_run参数 …...
末流211无科研保研经验分享
文章目录 个人背景夏令营哈工大威海西工大光电北航软院北邮计算机中科大科学岛 预推免东南软件北航计算机 写在最后心路历程寄语 个人背景 院校:末流211专业背景:计算机科学与技术排名:夏令营7 / 126,预推免3 / 126英语ÿ…...
日期选择器多选换行
<el-form-item label"日期选择"><div class"multi-date-picker"><div class"date-item"><span class"dateIcon"><el-icon><Calendar /></el-icon></span><span class"dateIt…...
NodeJS原型链污染ctfshow_nodejs
文章目录 NodeJS原型链污染&ctfshow_nodejs前言0x01.原型与原型链0x02.prototype和__proto__分别是什么?0x03.原型链继承不同对象的原型链* 0x04.原型链污染原理0x05.merge()导致原型链污染0x06.ejs模板引擎RCEejs模板引擎另一处rce 0x07.jade模板引擎RCE【ctfs…...
如何用Charticulator打破传统图表限制:数据可视化的革命性方法
如何用Charticulator打破传统图表限制:数据可视化的革命性方法 【免费下载链接】charticulator Interactive Layout-Aware Construction of Bespoke Charts 项目地址: https://gitcode.com/gh_mirrors/ch/charticulator 你是否曾为寻找合适的图表模板而烦恼&…...
AI辅助开发:用自然语言描述需求,让快马平台自动生成精准的Copaw自动化脚本
AI辅助开发:用自然语言描述需求,让快马平台自动生成精准的Copaw自动化脚本 最近在做一个自动化测试项目,需要大量使用Copaw框架来模拟用户操作。作为一个刚接触Copaw的新手,最头疼的就是要花大量时间研究各种API和页面元素定位方…...
深度解析DeepMIMO:毫米波大规模MIMO信道建模的5个架构设计决策
深度解析DeepMIMO:毫米波大规模MIMO信道建模的5个架构设计决策 【免费下载链接】DeepMIMO-matlab DeepMIMO dataset and codes for mmWave and massive MIMO applications 项目地址: https://gitcode.com/gh_mirrors/de/DeepMIMO-matlab 在5G/6G通信系统演进…...
QMK Toolbox终极指南:5步完成机械键盘固件刷写与自定义
QMK Toolbox终极指南:5步完成机械键盘固件刷写与自定义 【免费下载链接】qmk_toolbox A Toolbox companion for QMK Firmware 项目地址: https://gitcode.com/gh_mirrors/qm/qmk_toolbox QMK Toolbox是一款专为机械键盘爱好者设计的开源固件刷写工具…...
5个实战技巧让Continue插件成为你的JetBrains AI编程搭档
5个实战技巧让Continue插件成为你的JetBrains AI编程搭档 【免费下载链接】continue ⏩ Source-controlled AI checks, enforceable in CI. Powered by the open-source Continue CLI 项目地址: https://gitcode.com/GitHub_Trending/co/continue 在当今AI驱动的开发时代…...
RT-Thread线程管理实战技巧与常见问题解析
1. RT-Thread线程管理实战指南在嵌入式系统开发中,线程管理是RTOS(实时操作系统)最核心的功能之一。作为一名长期使用RT-Thread的开发者,我发现很多初学者在掌握了线程理论后,在实际应用中仍然会遇到各种问题。本文将深…...
终极Windows驱动管理指南:如何用DriverStore Explorer快速释放30GB磁盘空间
终极Windows驱动管理指南:如何用DriverStore Explorer快速释放30GB磁盘空间 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer DriverStore Explorer(简称RAPR&…...
告别手动逐个校验,用快马快速构建vmware密钥批量验证工具提升效率
告别手动逐个校验,用快马快速构建vmware密钥批量验证工具提升效率 最近在帮朋友处理一批VMware16的密钥验证工作,发现手动逐个检查不仅耗时耗力,还容易出错。特别是当需要验证几十甚至上百个密钥时,这种重复劳动简直让人崩溃。于…...
基于Qwen3-ASR的智能会议纪要系统:从语音识别到文本摘要全流程
基于Qwen3-ASR的智能会议纪要系统:从语音识别到文本摘要全流程 1. 系统整体效果展示 今天给大家展示一个基于Qwen3-ASR-1.7B语音识别模型构建的智能会议纪要系统。这个系统不仅能准确识别会议中的语音内容,还能自动区分不同说话人,提取关键…...
千问3.5-2B参数详解教程:max_new_tokens=192与temperature=0.7如何影响图文理解质量
千问3.5-2B参数详解教程:max_new_tokens192与temperature0.7如何影响图文理解质量 1. 认识千问3.5-2B视觉语言模型 千问3.5-2B是Qwen系列中的小型视觉语言模型,它能够同时理解图片内容和生成文本回答。这个模型特别适合需要结合视觉和语言理解的任务场…...
