C++实现Qt的信号与槽
一、使用C++11
封装类
// Connect.hpp #ifndef _CONNECT_H #define _CONNECT_H #include <vector> #include <memory> #include <functional> #define emit #define slots #define signals public #define connect(sender, signal, slot) ((sender)->signal.bind(slot)) template<typename... Args> class Slot { public: using OnFunc = std::function<void(Args&&...)>; Slot(const OnFunc& func) : m_func(func) { // Do nothing } void exec(Args&&... args) { m_func(std::forward<Args>(args)...); } private: OnFunc m_func = nullptr; }; template<typename... Args> class Signal { public: using SlotPtr = std::shared_ptr<Slot<Args&&...>>; using OnFunc = std::function<void(Args&&...)>; void bind(const OnFunc& func) { m_slotVec.push_back(SlotPtr(new Slot<Args&&...>(func))); } void operator()(Args&&... args) { for (auto& iter : m_slotVec) { iter->exec(std::forward<Args>(args)...); } } private: std::vector<SlotPtr> m_slotVec; }; #endif
使用
// main.cpp /************************************************ * 该例程讲解用C++11来实现Qt的信号槽机制 * 使用到的C++11特性有: * 1.可变参数模板类 * 2.智能指针 * 3.函数相关std::function、std::bind * 4.using关键字 * 5.完美转发std::forward ************************************************/ #include "Connect.hpp" #include <iostream> #include <string> class A { public: void start() { emit m_s1(); emit m_s2("Hello C++11"); emit m_s3(100, "Hello C++11"); } signals: Signal<> m_s1; // 不带参数的信号 Signal<std::string> m_s2; Signal<int, std::string> m_s3; }; class B { public slots: void func1() { std::cout << "func1" << std::endl; } void func2(const std::string& str) { std::cout << str << std::endl; } void func3(int n, const std::string& str) { std::cout << n << " " << str << std::endl; } }; void func(const std::string& str) { std::cout << "func " << str << std::endl; } int main() { A a; B b; // 信号与槽绑定 connect(&a, m_s1, std::bind(&B::func1, &b)); connect(&a, m_s2, std::bind(&B::func2, &b, std::placeholders::_1)); connect(&a, m_s3, std::bind(&B::func3, &b, std::placeholders::_1, std::placeholders::_2)); connect(&a, m_s2, std::bind(func, std::placeholders::_1)); connect(&a, m_s2, [](const std::string& str) { std::cout << "lambda str: " << str << std::endl; }); a.start(); return 0; }
转自:https://www.cnblogs.com/highway-9/p/5559558.html
还没看懂....
长风破浪会有时,直挂云帆济沧海!
可通过下方链接找到博主
https://www.cnblogs.com/judes/p/10875138.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2018-08-11 定位器
2018-08-11 QML-Loader
2016-08-11 svn的使用