QT构建构建DataBus总线

构建DataBus总线 怎么"用起来"。你照着做,跑通后你就会知道它到底在干啥。


1)先准备:定义要传的数据结构(Sample)

data/MonitorSample.h

cpp 复制代码
#pragma once
#include <QDateTime>
#include <QString>
#include <QMetaType>

struct MonitorSample {
    QDateTime ts;
    double temperature = 0.0;
    double voltage = 0.0;
    double current = 0.0;
    QString status;
};

Q_DECLARE_METATYPE(MonitorSample)

2)准备 DataBus(就是一个"广播器")

data/DataBus.h

cpp 复制代码
#pragma once
#include <QObject>
#include "MonitorSample.h"

class DataBus : public QObject {
    Q_OBJECT
public:
    static DataBus& instance() { static DataBus b; return b; }

signals:
    void sampleReady(const MonitorSample& s);

private:
    explicit DataBus(QObject* parent=nullptr) : QObject(parent) {}
};

3)在 main.cpp 注册类型(Qt5 必须)

main.cpp 里:

cpp 复制代码
#include <QApplication>
#include <QMetaType>
#include "data/MonitorSample.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    qRegisterMetaType<MonitorSample>("MonitorSample"); // ✅ 很关键

    ...
    return a.exec();
}

4)发布数据(emit):谁产生数据谁发

比如你在采集模块里(或先用 QTimer 测试):

cpp 复制代码
#include "data/DataBus.h"

MonitorSample s;
s.ts = QDateTime::currentDateTime();
s.temperature = 36.2;
s.voltage = 3.30;
s.current = 0.52;
s.status = "OK";

emit DataBus::instance().sampleReady(s);   // ✅ 发广播

这行就是 DataBus 的"使用点"之一:发布


5)订阅数据(connect):谁想用数据谁接

比如在 RecordUIMainWindow 里接收:

cpp 复制代码
#include "data/DataBus.h"
#include <QDebug>

connect(&DataBus::instance(), &DataBus::sampleReady,
        this, [this](const MonitorSample& s){
            qInfo() << "got sample:" << s.temperature << s.voltage;
            // 在这里写 CSV 或更新 UI
        },
        Qt::QueuedConnection);  // ✅ 跨线程安全

这行就是 DataBus 的"使用点"之二:订阅


6)把它接到 CSV 保存(你最想要的)

你已经有 CsvRecorder recorder; 的话,订阅里这么写:

cpp 复制代码
connect(&DataBus::instance(), &DataBus::sampleReady,
        this, [this](const MonitorSample& s){
            if (!recorder->isRunning()) return;
            recorder->writeRow({
                s.ts.toString("yyyy-MM-dd HH:mm:ss.zzz"),
                QString::number(s.temperature, 'f', 2),
                QString::number(s.voltage, 'f', 3),
                QString::number(s.current, 'f', 3),
                s.status
            });
        },
        Qt::QueuedConnection);

你真正要记住的就两句话

  • emit:产生数据的地方发出去
  • connect:需要数据的地方接收处理

这就是 DataBus 的全部用法。


相关推荐
为何创造硅基生物4 小时前
C语言 结构体内存对齐规则(通俗易懂版)
c语言·开发语言
吃好睡好便好4 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
星寂樱易李4 小时前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
仰泳之鹅5 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
之歆5 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
cen__y6 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
AI人工智能+电脑小能手6 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
社交怪人7 小时前
【算平均分】信息学奥赛一本通C语言解法(题号2071)
c语言·开发语言
郭涤生7 小时前
不同主机之间网络通信-以太网连接复习
开发语言·rk3588
山居秋暝LS7 小时前
【无标题】RTX00安装paddle OCR,win11不能装最新的,也不能用GPU
开发语言·r语言