Qt+C++ 控制软件架构实例

我给你讲一个接近真实工业项目规模(10万~20万行代码)的 Qt+C++ 控制软件架构实例

我会按照 真实工程师的思考过程来讲:

1️⃣ 项目背景

2️⃣ 第一版代码(很混乱)

3️⃣ 第一次架构升级

4️⃣ 第二次架构升级

5️⃣ 第三次架构升级

6️⃣ 最终成熟架构

7️⃣ 真实目录结构(工业级)

8️⃣ 典型代码例子

9️⃣ 一个完整功能如何在架构中流动

你会看到 大型项目其实是一步一步演化出来的


一、项目背景(真实设备类型)

假设我们做一个 自动光学检测设备(AOI)控制软件

设备包含:

text 复制代码
运动平台 (X/Y/Z电机)
工业相机
光源控制
温度传感器
气缸控制
网络通信
数据库
UI界面

功能:

text 复制代码
设备启动
自动检测流程
运动控制
拍照
图像算法检测
数据存储
远程控制
日志

规模:

text 复制代码
代码 10万~20万行
开发周期 2~3年
开发人数 5~10人

二、第一版代码(所有人都这么开始)

最初结构通常是:

text 复制代码
project
 ├── main.cpp
 ├── MainWindow.cpp
 ├── Motor.cpp
 ├── Camera.cpp
 ├── Sensor.cpp
 ├── TcpServer.cpp
 └── Algorithm.cpp

UI直接控制设备。


示例代码

UI点击按钮:

cpp 复制代码
void MainWindow::on_startButton_clicked()
{
    motor.moveTo(100);

    camera.capture();

    double result = algorithm.detect(camera.image());

    tcp.sendResult(result);
}

问题:

text 复制代码
UI
 ├── 控制运动
 ├── 控制相机
 ├── 调用算法
 └── 网络发送

UI变成超级类


三、第一次重构(Controller)

工程师意识到:

UI 不应该控制设备。

于是引入:

text 复制代码
Controller

新结构

text 复制代码
project
 ├── ui
 │   └── MainWindow
 │
 ├── controller
 │   ├── MotionController
 │   ├── CameraController
 │   └── InspectionController
 │
 └── driver
     ├── MotorDriver
     ├── CameraDriver
     └── SensorDriver

UI代码

变成:

cpp 复制代码
void MainWindow::on_startInspection_clicked()
{
    inspectionController.start();
}

InspectionController

cpp 复制代码
class InspectionController
{
public:

    void start()
    {
        motion.moveTo(100);

        camera.capture();

        auto img = camera.getImage();

        auto result = algorithm.detect(img);

        network.sendResult(result);
    }

private:

    MotionController motion;
    CameraController camera;
    DetectionAlgorithm algorithm;
};

UI变简单了。


四、第二次重构(Algorithm层)

随着算法变复杂:

text 复制代码
缺陷检测
图像滤波
边缘检测
深度学习

Controller变成:

cpp 复制代码
class InspectionController
{
    Filter filter;
    EdgeDetector edge;
    Classifier ai;
};

问题:

❌ 控制逻辑和算法混在一起

于是拆出:

text 复制代码
Algorithm

新结构

text 复制代码
project
 ├── controller
 ├── algorithm
 └── driver

Algorithm模块

cpp 复制代码
class DefectDetection
{
public:

    Result detect(Image img)
    {
        img = filter.apply(img);

        auto edge = edgeDetector.run(img);

        return classifier.predict(edge);
    }
};

Controller:

cpp 复制代码
class InspectionController
{
    DefectDetection detector;
};

五、第三次重构(通信系统)

设备需要:

text 复制代码
远程监控
远程启动
数据上传

通信包括:

text 复制代码
TCP
串口
Modbus

通信代码开始混乱。


工程师拆成两层:

text 复制代码
Protocol
Media

Media(传输)

text 复制代码
TCP
Serial
UDP

示例:

cpp 复制代码
class TcpServer
{
public:
    QByteArray receive();
};

Protocol(协议)

解析命令:

text 复制代码
START
STOP
SET_SPEED
cpp 复制代码
class DeviceProtocol
{
public:

    Command parse(QByteArray data);
};

流程:

text 复制代码
TCP
 ↓
Media
 ↓
Protocol
 ↓
Controller

六、第四次重构(Manager)

随着系统变大:

text 复制代码
MotionController
CameraController
InspectionController
NetworkController

问题:

text 复制代码
谁创建对象?
谁初始化?
谁管理生命周期?

于是加入:

text 复制代码
Manager

SystemManager

cpp 复制代码
class SystemManager
{
public:

    void init()
    {
        motionController.init();
        cameraController.init();
        networkController.init();
    }

    void start()
    {
        inspectionController.start();
    }
};

程序入口:

cpp 复制代码
int main()
{
    SystemManager system;

    system.init();

    system.start();
}

七、第五次重构(Service)

UI越来越复杂:

text 复制代码
设备控制
数据查询
状态查询

UI不应该直接调用Controller。

于是加入:

text 复制代码
Service

DeviceService

cpp 复制代码
class DeviceService
{
public:

    void startInspection()
    {
        inspectionController.start();
    }

    double getTemperature()
    {
        return sensorController.readTemp();
    }
};

UI:

cpp 复制代码
deviceService.startInspection();

八、最终成熟架构

大型系统最终会变成:

text 复制代码
UI
 ↓
Service
 ↓
Manager
 ↓
Controller
 ↓
Algorithm
 ↓
Protocol
 ↓
Media
 ↓
Driver
 ↓
Hardware

九、真实工业项目目录(经典)

一个典型 20万行控制软件结构

text 复制代码
project
│
├── app
│   └── main.cpp
│
├── ui
│   ├── MainWindow
│   ├── DevicePanel
│   └── StatusWidget
│
├── manager
│   ├── SystemManager
│   ├── DeviceManager
│   └── ThreadManager
│
├── service
│   ├── DeviceService
│   ├── DataService
│   └── ConfigService
│
├── controller
│   ├── MotionController
│   ├── CameraController
│   ├── LightController
│   └── InspectionController
│
├── algorithm
│   ├── Vision
│   ├── Motion
│   └── AI
│
├── protocol
│   ├── Modbus
│   ├── CustomProtocol
│
├── media
│   ├── Tcp
│   ├── Serial
│
├── driver
│   ├── MotorDriver
│   ├── CameraDriver
│   ├── LightDriver
│
├── thread
│   ├── ControlThread
│   ├── NetworkThread
│
└── tools
    ├── Logger
    ├── Config
    └── Utils

十、一个完整功能如何运行

用户点击:

text 复制代码
开始检测

系统流程:

text 复制代码
UI
 ↓
DeviceService
 ↓
InspectionController
 ↓
MotionController
 ↓
MotorDriver
 ↓
Motor

拍照:

text 复制代码
InspectionController
 ↓
CameraController
 ↓
CameraDriver
 ↓
Camera

算法:

text 复制代码
InspectionController
 ↓
Algorithm

网络:

text 复制代码
TCP
 ↓
Media
 ↓
Protocol
 ↓
Controller

十一、大型项目设计的核心思想

大型软件其实只有几个核心原则:

1 单一职责

每个模块只做一件事。


2 分层

text 复制代码
UI
Service
Controller
Driver

3 解耦

模块之间通过接口通信。


4 可扩展

增加新设备只需:

text 复制代码
NewController
NewDriver

十二、一句话总结

大型项目架构其实是:

text 复制代码
简单代码
 ↓
模块化
 ↓
分层
 ↓
服务化
 ↓
成熟架构

不断重构演化出来的


如果你愿意,我可以再给你讲一个真正非常关键但很多人不知道的东西

👉 为什么大型项目一定要做"事件驱动架构(Event Bus)"

很多系统(机器人 / 自动驾驶 / 工业设备 / Qt大型软件)都是靠它解决 模块耦合问题

理解这个,你基本就能看懂 任何大型软件架构

相关推荐
顾温2 小时前
c# 多线程
开发语言·c#
草莓熊Lotso2 小时前
Linux 进程间通信之命名管道(FIFO):跨进程通信的实用方案
android·java·linux·运维·服务器·数据库·c++
草莓熊Lotso2 小时前
MySQL 表约束核心指南:从基础约束到外键关联(含实战案例)
android·运维·服务器·数据库·c++·人工智能·mysql
xiaoye-duck2 小时前
《算法题讲解指南:递归,搜索与回溯算法--二叉树中的深搜》--10.二叉搜索树中第k小的元素,11.二叉树的所有路径
c++·算法·深度优先·递归
MegaDataFlowers2 小时前
认识O(NlogN)的排序
java·开发语言·排序算法
小鸡吃米…2 小时前
调试线程应用程序
开发语言·python
m0_672703312 小时前
上机练习第48天
数据结构·c++·算法
..过云雨2 小时前
【负载均衡oj项目】03. compile_server编译运行服务设计
运维·c++·html·负载均衡
卢锡荣2 小时前
LDR6500|超小封装 Type‑C DRP PD 控制芯片:边充边传,一芯极简,全能适配
开发语言·网络·人工智能·计算机外设·电脑