Qt 自定义信号槽

举报
鱼酱 发表于 2022/01/06 22:30:29 2022/01/06
【摘要】 使用 connect() 可以让我们连接系统提供的信号和槽。但是,Qt 的信号槽机制并不仅仅是使用系统提供的那部分,还会允许我们自己设计自己的信号和槽。这也是 Qt 框架的设计思路之一,用于我们设计解耦的程序。本节将讲解如何在自己的程序中自定义信号槽。 信号槽不是 GUI 模块提供的,而是 Qt 核心特性之一。因此,我们可以在普...

使用 connect() 可以让我们连接系统提供的信号和槽。但是,Qt 的信号槽机制并不仅仅是使用系统提供的那部分,还会允许我们自己设计自己的信号和槽。这也是 Qt 框架的设计思路之一,用于我们设计解耦的程序。本节将讲解如何在自己的程序中自定义信号槽。

信号槽不是 GUI 模块提供的,而是 Qt 核心特性之一。因此,我们可以在普通的控制台程序使用信号槽。


经典的观察者模式在讲解举例的时候通常会举报纸和订阅者的例子。有一个报纸类 Newspaper,有一个订阅者类 Subscriber。Subscriber 可以订阅 Newspaper。这样,当 Newspaper 有了新的内容的时候,Subscriber 可以立即得到通知。在这个例子中,观察者是 Subscriber,被观察者是 Newspaper。在经典的实现代码中,观察者会将自身注册到被观察者的一个容器中(比如 subscriber.registerTo(newspaper))。被观察者发生了任何变化的时候,会主动遍历这个容器,依次通知各个观察者(newspaper.notifyAllSubscribers())。


下面我们看看使用 Qt 的信号槽,如何实现上述观察者模式。注意,这里我们仅仅是使用这个案例,我们的代码并不是去实现一个经典的观察者模式。也就是说,我们使用 Qt 的信号槽机制来获得同样的效果。







  
  1. //!!! Qt5
  2. #include <QObject>
  3. // newspaper.h
  4. class Newspaper : public QObject
  5. {
  6. Q_OBJECT
  7. public:
  8. Newspaper(const QString & name) :
  9. m_name(name)
  10. {
  11. }
  12. void send()
  13. {
  14. emit newPaper(m_name);
  15. }
  16. signals:
  17. void newPaper(const QString &name);
  18. private:
  19. QString m_name;
  20. };
  21. // reader.h
  22. #include <QObject>
  23. #include <QDebug>
  24. class Reader : public QObject
  25. {
  26. Q_OBJECT
  27. public:
  28. Reader() {}
  29. void receiveNewspaper(const QString & name)
  30. {
  31. qDebug() << "Receives Newspaper: " << name;
  32. }
  33. };
  34. // main.cpp
  35. #include <QCoreApplication>
  36. #include "newspaper.h"
  37. #include "reader.h"
  38. int main(int argc, char *argv[])
  39. {
  40. QCoreApplication app(argc, argv);
  41. Newspaper newspaper("Newspaper A");
  42. Reader reader;
  43. QObject::connect(&newspaper, &Newspaper::newPaper,
  44. &reader, &Reader::receiveNewspaper);
  45. newspaper.send();
  46. return app.exec();
  47. }







文章来源: yujiang.blog.csdn.net,作者:鱼酱2333,版权归原作者所有,如需转载,请联系作者。

原文链接:yujiang.blog.csdn.net/article/details/72841146

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。