ski 和 db 模块的通信
qt 信号槽
创建一个单例类,在 db 模块发送信号,在ski 模块接收
class abSignalEmitter : public QObject {Q_OBJECTpublic: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 值变化时调用 lambdaa->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 自动更新