返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >详解c++实现信号槽
  • 166
分享到

详解c++实现信号槽

2024-04-02 19:04:59 166人浏览 独家记忆
摘要

目录用c++实现信号槽机制(signal-slot)总结用c++实现信号槽机制(signal-slot) 信号槽机制的个人理解:信号槽是在两个c++类对象之间建立联系的通道,其中一

用c++实现信号槽机制(signal-slot)

信号槽机制的个人理解:信号槽是在两个c++类对象之间建立联系的通道,其中一个对象可称之为信号发送者(sender),另一个对象可称之为信号接收者(recver),sender通过信号槽发出信号后,recver就可以执行函数进行某些操作。也就是说应用程序通过信号槽可以在两个互不相关的对象之间建立起逻辑关系,使程序开发变得简洁、方便。

信号槽本质是由c++定义的类组成,分为两个部分:槽类和信号类

槽类(slot):可理解为插槽,其内部有两个私有成员,存储待执行的类对象和对象中的方法指针,可理解将信号接收者(recver)插入了插槽中。槽的另一端连接信号,通过在信号(signal)类的实例中存储槽(slot)指针的方式实现,若在signal对象中插入多个slot,则代表一个信号与多个recver建立了联系,当信号来临时,可以根据slot的插入先后顺序轮流执行事件方法。

信号类(signal):其内部有一个容器,存储连接到信号类实例的槽类指针,同时提供一个执行方法,当方法调用时,在方法内部调用所存储的槽类指针所指向的槽内部保存的recver的方法。

若要使用信号槽,则信号发送者(sender)类需要在内部包含信号类(signal)实例,同时包含一个方法来调用signal上的执行方法。该方法称之为发出信号。

综上,作为sender的任意object类包含有signal成员,通过func发出信号,func内部调用object.signal上的执行方法,此处通过重载()实现,执行方法内部是循环调用保存在signal中的slot指针列表,而slot指针指向的slot实例中存储有recver和recver.func,通过slot的exec方法则可以执行func,这就实现了一个触发信号的完整流程。

为了实现任意sender和任意recver关联,slot和signal类并不知道要关联对象以及执行方法的具体类型和参数类型,因此要使用泛型编程

代码及说明如下(整理借鉴自csdn):


/// <summary>
/// 先实现槽基类,包含两个虚函数对象,主要为后续调用提供接口
/// 子类负责实现exec方法
/// </summary>
/// <typeparam name="TParam">Recver中待执行函数的参数类型</typeparam>
template <class TParam>
class SlotBase
{
public:
    virtual void Exec(TParam param) = 0;
    virtual ~SlotBase() {};
};
/// <summary>
/// Slot子类,负责实现exec方法,通过exec调用recver.func,同时Slot构造函数负责初始化两个内部变量,将需要关联的recver和recver.func插入槽
/// </summary>
/// <typeparam name="TRecver">recver类的具体类型</typeparam>
/// <typeparam name="TParam">recver.func的参数类型</typeparam>
template <class TRecver,class TParam>
class Slot:public SlotBase<TParam>
{
public:
    Slot(TRecver* pObj, void (TRecver::* func)(TParam)) 
    {
        m_pRecver = pObj;
        m_func = func;
    };
    VOID Exec(TParam param)
    {
        (m_pRecver->*m_func)(param);
    };
private:
    TRecver* m_pRecver = NULL;
    void (TRecver::* m_func)(TParam);
};
/// <summary>
/// 信号类
/// 私有成员m_pSlotSet,存储槽指针的vector
/// 重载(),在括号调用参数时,循环调用m_pSlotSet中存储的槽指针,将参数传递给槽的exec方法
/// bind():将一个槽与信号类实例关联起来
/// 
/// </summary>
/// <typeparam name="TParam">待执行方法的参数类型</typeparam>
/// <typeparam name="TRecver">recver类的类型</typeparam>
template<class TParam>
class Signal
{
public:
    template<class TRecver>
    void Bind(TRecver* pObj, void (TRecver::* func)(TParam))
    {
        m_pSlotSet.push_back(new Slot<TRecver,TParam>(pObj, func));
    };
    void operator()(TParam param)
    {
        for(int i=0;i<m_pSlotSet.size();i++)
        {
            m_pSlotSet[i]->Exec(param);
        }
    };
    ~Signal() 
    {
        for (int i = 0; i < m_pSlotSet.size(); i++)
            delete m_pSlotSet[i];
    };
private:
    std::vector<SlotBase<TParam>*> m_pSlotSet;
};
//开始模拟
class RecverOne
{
public:
    void functionOne(int param) 
    {
        std::cout << "这是接收者1中的某个方法执行:" << param << std::endl;
    };
};
class RecverTwo
{
public:
    void functionTwo(int param)
    {
        std::cout << "这是接收者2中的某个方法执行:" << param << std::endl;
    };
};
class SenderObj
{
public:
    //模拟值改变发出信号
    void testSginal(int param) 
    {
        valueChanged(param);
    };
public:
    Signal<int> valueChanged;//定义一个当值改变时触发的信号
};
//为了更方便地将sender中的signal与槽和recver关联,可以定义一个宏
#define connect(sender,signal,recver,method) ((sender)->signal.Bind(recver,method))
int main()
{
    //开始测试
    //先定义两个接收者
    RecverOne* R1 = new RecverOne;
    RecverTwo* R2 = new RecverTwo;
    //定义一个发送者
    SenderObj* sd = new SenderObj;
    //将R1和R2中的函数插入sd中的信号槽
    connect(sd, valueChanged, R1, &RecverOne::functionOne);
    connect(sd, valueChanged, R2, &RecverTwo::functionTwo);
    //发送信号
    sd->valueChanged(5);
    std::cout << "Hello World!\n";
}
 

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: 详解c++实现信号槽

本文链接: https://lsjlt.com/news/160289.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解c++实现信号槽
    目录用c++实现信号槽机制(signal-slot)总结用c++实现信号槽机制(signal-slot) 信号槽机制的个人理解:信号槽是在两个c++类对象之间建立联系的通道,其中一...
    99+
    2024-04-02
  • C++Boost.Signals2信号/槽概念
    目录一、关于Boost.Signals2二、关于Signals库练习一、关于Boost.Signals2 Boost.Signals2 实现了信号/槽的概念。一个或多个函数(称为槽)...
    99+
    2022-12-08
    C++ Boost Signals2 C++ Signals2信号
  • PyQt5信号与槽机制案例详解
    信号和槽机制是 QT 的核心机制,要精通 QT 编程就必须对信号和槽有所了解。信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包的重要...
    99+
    2024-04-02
  • Qt开发实现跨窗口信号槽通信
    多窗口通信,如果是窗口类对象之间互相包含,则可以直接开放public接口调用,不过,很多情况下主窗口和子窗口之间要做到异步消息通信,就必须依赖到跨窗口的信号槽,以下是一个简单的示例。...
    99+
    2024-04-02
  • Qt信号自定义槽函数的实现
    目录使用无参数信号与槽使用有参信号传递点击按钮触发信号匿名函数与槽Qt中实现自定义信号与槽函数,信号用于发送并触发槽函数,槽函数则是具体的功能实现,如下我们以老师学生为例子简单学习一...
    99+
    2024-04-02
  • Qt开发如何实现跨窗口信号槽通信
    这篇文章主要介绍“Qt开发如何实现跨窗口信号槽通信”,在日常操作中,相信很多人在Qt开发如何实现跨窗口信号槽通信问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Qt开发如何实现跨窗口信号槽通信”的疑惑有所帮助!...
    99+
    2023-06-22
  • 深入理解Qt信号槽机制
    目录1. 信号和槽概述1.1 信号的本质1.2 槽的本质1.3 信号和槽的关系1. 信号和槽概述 信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式(发布-订阅模...
    99+
    2024-04-02
  • QT中删除信号于槽的连接的实现
    如果是在UI里建立的,那就在下面这个函数里删除连接槽函数的对应行 void MainForm::qt_static_metacall(QObject *_o, QMetaObject...
    99+
    2024-04-02
  • python如何实现信号与槽的断开与连接
    这篇文章主要介绍了python如何实现信号与槽的断开与连接,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。信号与槽的断开与连接有时候基于某些原...
    99+
    2024-04-02
  • C++使用标准库实现事件和委托以及信号和槽机制
    目录1 .Net的委托和事件2.Qt的信号和槽3.Duilib中委托和事件4.使用C++标准库简单实现事件触发机制5.总结在日常的程序开发中我们经常会遇到以下的实际问题: 比如在一个...
    99+
    2022-11-13
    C++标准库实现事件委托 C++标准库实现信号 槽机制 C++ 标准库
  • Vue3插槽Slot实现原理详解
    目录Vue官方对插槽的定义Slot到底是什么如何使用插槽回顾组件渲染的原理插槽的初始化原理解析插槽中的内容作用域插槽原理具名插槽原理默认内容插槽的原理Vue官方对插槽的定义 Vue ...
    99+
    2024-04-02
  • 如何进行Qt 信号自定义槽函数的实现
    本篇文章为大家展示了如何进行Qt 信号自定义槽函数的实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Qt中实现自定义信号与槽函数,信号用于发送并触发槽函数,槽函数则是具体的功能实现,如下...
    99+
    2023-06-21
  • Golang信号量设计实现示例详解
    目录开篇信号量semaphore 扩展库实现AcquireReleaseTryAcquire总结开篇 在我们此前的文章 Golang Mutex 原理解析 中曾提到过,Mutex 的...
    99+
    2024-04-02
  • C语言详解UDP通信的实现
    UDP通信 UDP服务端创建的socket是直接用来通信的套接字,没有类似TCP一样创建一个监听的socket。 UDP相关函数: #include <sys/types.h...
    99+
    2024-04-02
  • qt信号槽连接connect无响应如何解决
    当 `connect` 函数无响应时,可能是由于以下几个原因造成的:1. 信号和槽的参数不匹配:确保信号和槽的参数类型和数量匹配。如...
    99+
    2023-09-27
    qt
  • React中实现插槽效果的方案详解
    目录React实现插槽children实现插槽props实现插槽React实现插槽 在开发中,我们抽取了一个组件,但是为了让这个组件具备更强的通用性,我们不能将组件中的内容限制为固定...
    99+
    2024-04-02
  • Python深度学习实战PyQt5信号与槽的连接
    目录1. 信号与槽(Signals and slots)1.1 信号与槽的原理1.2 信号发送者与槽的接收者2. QtDesigner 建立信号与槽的连接2.1 信号与槽的连接:不同...
    99+
    2024-04-02
  • golang 监听服务的信号,实现平滑启动,linux信号说明详解
    监听服务的信号,实现平滑启动,linux信号说明 package main import ( "context" "fmt" "golang.org/x/sync/er...
    99+
    2024-04-02
  • Python OpenCV实现识别信用卡号教程详解
    目录通过与 OpenCV 模板匹配的 OCR信用卡 OCR 结果总结今天的博文分为三个部分。 在第一部分中,我们将讨论 OCR-A 字体,这是一种专为辅助光学字符识别算法而创建的字体...
    99+
    2024-04-02
  • Python3实现捕获Ctrl+C终止信号
    目录技术背景基础案例给终止信号传入外部参数总结概要技术背景 对于一些连续运行或者长时间运行的Python程序而言,如服务器的后端,或者是长时间运行的科学计算程序。当我们涉及到一些中途...
    99+
    2023-03-13
    Python捕获Ctrl+C终止信号 Python Ctrl+C终止信号 Python捕获信号
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作