您的位置:首页 > 科技 > IT业 > C++,观察者模式,模拟Qt的信号和槽机制

C++,观察者模式,模拟Qt的信号和槽机制

2025/2/26 8:14:53 来源:https://blog.csdn.net/qq_42692132/article/details/139566740  浏览:    关键词:C++,观察者模式,模拟Qt的信号和槽机制

运行在VS2022,x86,Debug下

33. 模拟Qt信号和槽机制

  • 信号与槽实现原理:观察者模式,即当一个对象被修改时,就会自动通知依赖它的对象。
  • 应用:对象间的通信。
  • Qt实现信号与槽,代码如下。
#include <QObject>//发送者
class Sender : public QObject 
{Q_OBJECT  //必须在类声明中包含这个宏public:signals: void signal();  //声明信号void sendSignal()  //发射信号{emit signal(); //通过emit关键字发射信号}
};// 接收者
class Receiver : public QObject 
{Q_OBJECTpublic slots:void handleSignal() // 槽函数,处理信号{qDebug() << "Signal received";}
};int main() {Sender sender;Receiver receiver;// 将信号与槽连接起来QObject::connect(&sender, &Sender::signal, &receiver, &Receiver::handleSignal);// 发射信号sender.sendSignal();return 0;
}
  • 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;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com