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

铁佛  金牌会员 | 2024-6-11 11:09:57 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 877|帖子 877|积分 2631

运行在VS2022,x86,Debug下
33. Qt信号与槽



  • 实现原理:观察者模式,即当一个对象被修改时,就会主动通知依靠它的对象。
  • 应用:对象间的通讯。
33.1. Qt实现信号与槽,代码如下。

  1. #include <QObject>
  2. #include <QDebug>
  3. //发送者
  4. class Sender : public QObject
  5. {
  6.     Q_OBJECT  //必须在类声明中包含这个宏
  7. signals: void signal();  //声明信号
  8. public:  
  9.         void sendSignal()  //发射信号
  10.     {
  11.         emit signal(); //通过emit关键字发射信号
  12.     }
  13. };
  14. // 接收者
  15. class Receiver : public QObject
  16. {
  17.     Q_OBJECT
  18. public slots:
  19.     void handleSignal() // 槽函数,处理信号
  20.     {
  21.         qDebug() << "Signal received";
  22.     }
  23. };
  24. int main(int argc, char *argv[])
  25. {
  26.     QApplication a(argc, argv);
  27.    
  28.     Sender sender;
  29.     Receiver receiver;
  30.     // 将信号与槽连接起来
  31.     QObject::connect(&sender, &Sender::signal, &receiver, &Receiver::handleSignal);
  32.     // 发射信号
  33.     sender.sendSignal();
  34.     return a.exec();
  35. }
  36. #include "main.moc"
复制代码
33.2. C++模拟实现信号与槽,代码如下。

通过将函数指针传递给另一个函数,该函数可以在需要时通过该指针调用相应的函数,实现回调的效果。
  1. using SlotType = void(*)(void*); //定义槽函数指针类型,参数是void*,接收任意类型的数据
  2. // 发送者
  3. class Sender
  4. {
  5. private:
  6.     vector<SlotType> slots;       //槽函数列表
  7. public:
  8.     void connect(SlotType slot)   //连接信号与槽
  9.     {
  10.         slots.emplace_back(slot); //将槽函数指针添加到槽列表中
  11.     }
  12.     void sendSignal(void* data)  //发射信号
  13.     {
  14.         for (auto&& slot : slots)
  15.             slot(data);     //调用所有已连接的槽函数
  16.     }
  17. };
  18. // 接收者
  19. class Receiver
  20. {
  21. public:
  22.     static void handleSignal(void* data)  //槽函数,处理信号
  23.     {
  24.         cout << "Signal received: " << *static_cast<int*>(data) << endl;
  25.     }
  26. };
  27. int main() {
  28.     Sender sender;
  29.     //将信号与槽连接起来
  30.     sender.connect(&Receiver::handleSignal);
  31.     //发射信号
  32.     int signalData = 42;
  33.     sender.sendSignal(&signalData);
  34.     return 0;
  35. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

铁佛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表