ToB企服应用市场:ToB评测及商务社交产业平台

标题: Qt实现信号与槽,模拟Qt的信号与槽,观察者模式 [打印本页]

作者: 铁佛    时间: 2024-6-11 11:09
标题: Qt实现信号与槽,模拟Qt的信号与槽,观察者模式
运行在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企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4