ski 和 db 模块的通信

ski 和 db 模块的通信

qt 信号槽

创建一个单例类,在 db 模块发送信号,在ski 模块接收

class abSignalEmitter : public QObject {
  Q_OBJECT

 public:
  static abSignalEmitter& instance() {
    static abSignalEmitter instance;
    return instance;
  }
  abSignalEmitter(const abSignalEmitter&) = delete;
  abSignalEmitter& operator=(const abSignalEmitter&) = delete;

  void setSkyverse(bool enable) {
    emit skyverseChanged(enable);
  }

  signals:
  void skyverseChanged(bool enable);

 public:
  abSignalEmitter() : QObject() {}
  ~abSignalEmitter() {}
};

abSignalEmitter* se = &abSignalEmitter::instance();
connect(se, SIGNAL(skyverseChanged(bool)), this, SLOT(updateSkyverseCB(bool)));

全局事件总线

enum class EventType {
  DbImageChanged,
  SharedLayoutChanged
};

class abEventBus {
 public:
  using Handler = std::function<void(int)>;

  static abEventBus& instance() {
    static abEventBus bus;
    return bus;
  }

  void subscribe(EventType event, Handler h) {
    m_handlers[static_cast<int>(event)].push_back(h);
  }

  void publish(EventType event, int value) {
    auto it = m_handlers.find(static_cast<int>(event));
    if (it != m_handlers.end()) {
      for (auto& h : it->second)
        h(value);
    }
  }

 private:
  std::map<int, std::vector<Handler>> m_handlers;
};

模块A:

abEventBus::instance().publish(EventType::SharedLayoutChanged, b);

模块B:

abEventBus::instance().subscribe(EventType::SharedLayoutChanged,
                                    [this](int b){ updateShmGB(b); });

纯 C++ 观察者模式(无 Qt 依赖)

#ifndef A_H
#define A_H

#include <vector>
#include <functional>

class A
{
public:
    using Callback = std::function<void(int)>;

    void setValue(int v) {
        if (m_value == v)
            return;
        m_value = v;
        notifyObservers();
    }

    int value() const { return m_value; }

    // 注册观察者
    void addObserver(const Callback& cb) {
        m_observers.push_back(cb);
    }

private:
    void notifyObservers() {
        for (auto& cb : m_observers) {
            cb(m_value);
        }
    }

private:
    int m_value = 0;
    std::vector<Callback> m_observers;
};

#endif // A_H
#ifndef B_H
#define B_H

#include "a.h"
#include <QLabel>

class B
{
public:
    B(A* a, QLabel* label)
        : m_label(label)
    {
        // 注册监听,当 A 值变化时调用 lambda
        a->addObserver([this](int newValue){
            onAValueChanged(newValue);
        });
    }

    void onAValueChanged(int newValue) {
        m_label->setText(QString("A's value = %1").arg(newValue));
    }

private:
    QLabel* m_label;
};

#endif // B_H

使用:

A* a = new A();
QLabel* label = new QLabel();
B* b = new B(a, label);

a->setValue(100);  // b 的 GUI 自动更新
posted @ 2025-10-23 19:28  卑以自牧lq  阅读(1)  评论(0)    收藏  举报