Qt实现信号与槽,模拟Qt的信号与槽,观察者模式

news/2024/10/17 22:27:14/

运行在VS2022,x86,Debug下

33. Qt信号与槽

  • 实现原理:观察者模式,即当一个对象被修改时,就会自动通知依赖它的对象。
  • 应用:对象间的通信。

33.1. Qt实现信号与槽,代码如下。

#include <QObject>
#include <QDebug>//发送者
class Sender : public QObject 
{Q_OBJECT  //必须在类声明中包含这个宏signals: void signal();  //声明信号public:  void sendSignal()  //发射信号{emit signal(); //通过emit关键字发射信号}
};// 接收者
class Receiver : public QObject 
{Q_OBJECTpublic slots:void handleSignal() // 槽函数,处理信号{qDebug() << "Signal received";}
};int main(int argc, char *argv[])
{QApplication a(argc, argv);Sender sender;Receiver receiver;// 将信号与槽连接起来QObject::connect(&sender, &Sender::signal, &receiver, &Receiver::handleSignal);// 发射信号sender.sendSignal();return a.exec();
}#include "main.moc"

33.2. C++模拟实现信号与槽,代码如下。

通过将函数指针传递给另一个函数,该函数可以在需要时通过该指针调用相应的函数,实现回调的效果。

using SlotType = void(*)(void*); //定义槽函数指针类型,参数是void*,接收任意类型的数据// 发送者
class Sender 
{
private:vector<SlotType> slots;       //槽函数列表public:void connect(SlotType slot)   //连接信号与槽{ slots.emplace_back(slot); //将槽函数指针添加到槽列表中}void sendSignal(void* data)  //发射信号{for (auto&& slot : slots)slot(data);     //调用所有已连接的槽函数} 
};// 接收者
class Receiver 
{
public:static void handleSignal(void* data)  //槽函数,处理信号{cout << "Signal received: " << *static_cast<int*>(data) << endl; }
};int main() {Sender sender;//将信号与槽连接起来sender.connect(&Receiver::handleSignal);//发射信号int signalData = 42;sender.sendSignal(&signalData); return 0;
}

http://www.ppmy.cn/news/1469518.html

相关文章

【设计模式】行为型设计模式之 策略模式学习实践

介绍 策略模式&#xff08;Strategy&#xff09;&#xff0c;就是⼀个问题有多种解决⽅案&#xff0c;选择其中的⼀种使⽤&#xff0c;这种情况下我们 使⽤策略模式来实现灵活地选择&#xff0c;也能够⽅便地增加新的解决⽅案。⽐如做数学题&#xff0c;⼀个问题的 解法可能有…

设计模式:从接口的角度切入静态工厂模式

面向接口编程的意义 所谓面向接口去编程的核心含义就是为了——“封装隔离” 通常的封装&#xff0c;是指对数据结构的封装&#xff0c;将几种数据类型整到一块&#xff0c;组成一个新的数据类型&#xff1b;而java中的封装&#xff0c;包含对数据和行为进行抽象&#xff0c;…

重新学习STM32(1)GPIO

概念简介 GPIO 是通用输入输出端口的简称&#xff0c;简单来说就是 STM32 可控制的引脚。STM32 芯片通过 GPIO 引脚与外部设备连接起来&#xff0c;从而实现与外部通讯、控制以及数据采集的功能。 GPIO被分成很多组&#xff0c;比如 GPIOA和GPIOB等。所有的 GPIO引脚都有基本的…

数据结构-3、栈、队列和数组

3.1、栈 3.1.1、栈的基本概念&#xff1a; 1、栈的定义&#xff1a; ​ 栈是只允许在一端进行插入或删除操作的线性表。首先&#xff0c;栈是一种线性表&#xff0c;但限定这种线性表只能在某一端进行插入和删除操作&#xff0c;如下图&#xff1a; ​ 栈顶&#xff08;Top&…

关闭kylin(麒麟)系统的安全认证(烦人的安全认证)

打开grub sudo vim /etc/default/grup修改安全认证选项 增加12行&#xff0c;把13行注释掉 保存更改, 然后执行下面的命令&#xff1a; sudo sync sudo reboot重启成功后&#xff0c;就关闭了安全认证了~~~~~。 总体来讲&#xff0c;kylin还是基于ubuntu的内核的&#xff0c;…

springboot事务失效场景有哪些

1、方法未被声明为事务 在Spring Boot中&#xff0c;事务是基于注解或XML配置的方式进行声明的。如果一个方法没有被声明为事务&#xff0c;那么其中的数据库操作将不会受到事务管理的影响&#xff0c;可能导致数据不一致的问题。 2、异常未被抛出 在默认情况下&#xff0c;…

二手物品交易系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;商家管理&#xff0c;用户管理&#xff0c;商品管理&#xff0c;用户咨询管理 商家账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;商品管理&#xff0c;用…

统计信号处理基础 习题解答10-16

题目&#xff1a; 对于例10.1&#xff0c;证明由观察数据得到的信息是&#xff1a; 解答&#xff1a; 基于习题10-15的结论&#xff0c;&#xff0c;那么&#xff1a; 而根据习题10-15的结论&#xff1a; 此条件概率也是高斯分布&#xff0c;即&#xff1a; 根据相同的计算&a…