当前位置: 首页 > news >正文

ski 和 db 模块的通信

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 自动更新
http://www.hskmm.com/?act=detail&tid=37571

相关文章:

  • 完整教程:ImmuCellAI 免疫浸润分析
  • 4.6.2版本来了!快来看看新版本有哪些改动
  • 2025-10-22 ZR-J 模拟赛 赛后总结【ZR】
  • P5285 [十二省联考 2019] 骗分过样例
  • Liferay Portal与DXP集合提供程序存在授权缺失漏洞分析
  • MapGIS Objects Java计算一条三维线段与一个三角形所在的平面的交点 - 教程
  • layui时间与日期选择器,时间范围查询数据,后端springboot
  • 读书笔记:OpenPBR 规范(2)
  • 轻量级图片信息解析程序
  • 2025.10.23 闲话-全局位运算 max 的解法
  • 习题-无限集与选择公理
  • Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试及其解决方法
  • 项目管理软件是不是伪需求?
  • 题解:CF2115F1 Gellyfish and Lycoris Radiata (Easy Version)
  • 低代码如何重塑IT部门价值?
  • LIS 略解
  • 低代码如何引爆全员创新?揭秘技术民主化背后的蒲公英效应
  • LLM学习笔记DAY10
  • 2025工业冰水机/冷水机厂家推荐东莞市凯诺机械,高效制冷稳定运行
  • 2025小型低温/工业/风冷/一体式螺杆冷冻机厂家推荐:东莞凯诺机械专业制冷解决方案
  • 2025水冷螺杆/风冷螺杆冷水机厂家推荐东莞市凯诺机械,高效制冷稳定可靠
  • LLM学习笔记DAY9
  • OJ模拟面试3(异步判题架构)
  • Edge浏览器网页设置深色模式(仅搜索结果界面)
  • 2025 年 AI 编程工具 TOP5 排名:谁在重新定义研发效率?
  • noipd8t2 - Slayer
  • 【Go】go学习笔记
  • todolist
  • 利用排列组合法实现TOPN路径计算
  • 达梦数据库获取判断字段中的json数据中的值