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 自动更新
浙公网安备 33010602011771号