IT评测·应用市场-qidao123.com

标题: 观察者模式详解:用 Qt 信号与槽机制深入明白 [打印本页]

作者: 一给    时间: 2025-3-22 07:30
标题: 观察者模式详解:用 Qt 信号与槽机制深入明白


弁言

你是否曾碰到如许的需求:一个对象的状态发生变革后,盼望通知其他对象进行相应的更新?好比:

这些场景都适用于观察者模式(Observer Pattern)
在本篇文章中,我们不仅讲清楚观察者模式的结构,还会用 Qt 的信号与槽机制 来深入剖析,让你真正明白这一模式的奥秘!

1. 什么是观察者模式?

观察者模式是一种 一对多 的计划模式,答应多个对象(观察者)监听某个对象(被观察者)的状态变革,并在变革时收到通知。
   简单来说:
  
  现实例子:
场景被观察者(Subject)观察者(Observer)微信公众号订阅公众号订阅的用户股票市场股票关注股票的投资者UI 界面按钮点击按钮(QPushButton)监听点击的槽函数
2. 观察者模式的结构

观察者模式一样平常包括以下脚色:
观察者模式 UML 结构图

  1. +-------------+       +----------------+
  2. |  Observer   |<------|    Subject     |
  3. +-------------+       +----------------+
  4. | +update()   |       | +attach()      |
  5. |             |       | +detach()      |
  6. |             |       | +notify()      |
  7. +-------------+       +----------------+
复制代码

3. 传统 C++ 实现观察者模式

在 C++ 中,我们可以用 vector 存储观察者列表,并手动通知它们:
传统 C++ 实现

  1. #include <iostream>
  2. #include <vector>
  3. // 观察者接口
  4. class Observer {
  5. public:
  6.     virtual void update(int value) = 0;
  7. };
  8. // 被观察者(Subject)
  9. class Subject {
  10. private:
  11.     std::vector<Observer*> observers;
  12.     int state;
  13. public:
  14.     void attach(Observer* observer) { observers.push_back(observer); }
  15.     void notify() {
  16.         for (Observer* obs : observers) {
  17.             obs->update(state);
  18.         }
  19.     }
  20.     void setState(int value) {
  21.         state = value;
  22.         notify();
  23.     }
  24. };
  25. // 具体观察者
  26. class ConcreteObserver : public Observer {
  27. public:
  28.     void update(int value) override {
  29.         std::cout << "Observer received update: " << value << std::endl;
  30.     }
  31. };
  32. int main() {
  33.     Subject subject;
  34.     ConcreteObserver observer1, observer2;
  35.     subject.attach(&observer1);
  36.     subject.attach(&observer2);
  37.     subject.setState(42);  // 触发通知
  38. }
复制代码
题目:


4. 用 Qt 信号与槽实现观察者模式

Qt 提供了一种更强大、更安全的实现方式——信号(Signal)与槽(Slot)机制。它本质上就是观察者模式的扩展,但更加机动和易用!

信号与槽怎样实现观察者模式?

观察者模式脚色Qt 信号与槽对应Subject(被观察者)QObject + SignalObserver(观察者)QObject + Slot通知机制connect()
Qt 实现观察者模式

  1. #include <QObject>
  2. #include <QDebug>
  3. // 被观察者(Subject)
  4. class Subject : public QObject {
  5.     Q_OBJECT
  6. signals:
  7.     void valueChanged(int newValue);  // 信号(事件)
  8. public:
  9.     void setValue(int value) {
  10.         emit valueChanged(value);  // 触发信号,通知观察者
  11.     }
  12. };
  13. // 观察者(Observer)
  14. class Observer : public QObject {
  15.     Q_OBJECT
  16. public slots:
  17.     void onValueChanged(int newValue) {
  18.         qDebug() << "Observer received new value:" << newValue;
  19.     }
  20. };
  21. int main() {
  22.     Subject subject;
  23.     Observer observer;
  24.     // 连接信号和槽
  25.     QObject::connect(&subject, &Subject::valueChanged, &observer, &Observer::onValueChanged);
  26.     // 触发事件
  27.     subject.setValue(42);
  28. }
复制代码
Qt 信号与槽 vs 传统观察者模式

对比项传统观察者模式Qt 信号与槽观察者管理方式需手动维护列表主动管理触发方式直接调用 update()emit 发送信号线程安全需要手动同步Qt:ueuedConnection 支持多线程排除毗连需要手动移除观察者disconnect() 轻松解绑
5. 信号与槽让观察者模式更强大


6. 观察者模式怎样运用到实际开发中?

1. UI 界面更新


  1. QObject::connect(&subject, &Subject::valueChanged, ui->label, &QLabel::setText);
复制代码
2. 多线程使命通知主线程


3. 事件驱动开发



7. 总结


你学会了吗?




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4