Qt的前端和后端过于耦合(0/7)

        最近在写一个软件,这个软件稍微复杂一些,界面大概需要十几个,后端也是要开多线程读各种传感器数据。然后鼠鼠我呀就发现一个致命的问题,那就是前端要求的控件太多了,点一下就需要通知后端,即调用后端的函数,这是非常不友好的。因为耦合程度太高了,交互起来过于混乱严重影响开发进度。如果是一个人设计的可能稍微好一些(一个按钮实现一个函数呗),但是如果是团队分工的话就会很麻烦。后面问了大佬,大佬给我提供了一个思路,然后我会又去问了GPT。把相关的方法也写进来了。准备写个小合集,现在这里占个坑,后面在慢慢补齐。

        大佬最后还给了一个建议:

        要解耦,就不要想到什么功能立马实现地态度创建文件写实现,而是需要抱着写库的思路去写功能,把库(模块)写的差不多了再利用界面去调用接口


目录

✅ 1. 信号与槽机制(Signals & Slots) ✅【小工程推荐】

✔ 特点:

✔ 示例:

✅ 2. 事件总线 / 消息中心(Event Bus / Message Center) ✅【适合全局广播】

✔ 特点:

✔ 示例实现:

✅ 3. 观察者模式(Observer Pattern) 🧩【设计模式基础】

✔ 特点:

✅ 4. 发布-订阅模式(Pub-Sub Pattern) 🗞️【带中介的观察者模式】

✔ 特点:

✅ 5. 自定义 QEvent + 事件投递机制(高级/底层)

✔ 特点:

✅ 6. MVC/MVVM 架构分层

✔ 特点:

✅ 7. 前后端分离架构(Frontend-Backend Separation)

✔ 模型

✔ 可选实现方式(C++ 服务端):

✅ 总结对比表:

✅ Qt 中前后端通信与解耦方式对比(含跨进程/语言)

✅ 各方法适用范围速览:

✅ 推荐使用建议:

✅ Qt 多线程通信方法对比表


这里是邪恶的分界线


✅ 1. 信号与槽机制(Signals & Slots) ✅【小工程推荐】

✔ 特点:

  • Qt 原生支持

  • 松耦合、线程安全(带 QueuedConnection

  • 谁关心谁连接,不需要直接引用对象

✔ 示例:

connect(controller, &Controller::dataUpdated, ui, &MainWindow::updateUI);

        优点:前端 UI 和后端逻辑彼此独立,只通过信号/槽通信。

        缺点也很明显,一次调用就需要写对应的信号函数和槽函数。UI界面如果功能要求很多的情况下会与其他的模块过于耦合。甚至改了一个点,代码就立即崩溃。

✔ 拓展:配合定时器实现定时巡查:

    connect(mTimer, &QTimer::timeout, this, &类::onTimerTimeout);

✅ 2. 事件总线 / 消息中心(Event Bus / Message Center) ✅【适合全局广播】

✔ 特点:

  • 所有模块注册到一个全局消息中心

  • 事件发布者和订阅者互不依赖

  • 支持“一次广播,多方接收”

✔ 示例实现:

// 发出事件
MessageCenter::instance().postMessage({ MessageType::JoystickAngleChanged, QVariant::fromValue(angle) });// 监听事件
connect(&MessageCenter::instance(), &MessageCenter::messagePosted, this, [](const Message& msg) {if (msg.type == MessageType::JoystickAngleChanged) {float angle = msg.data.toFloat();// 处理逻辑}
});

✅ 3. 观察者模式(Observer Pattern) 🧩【设计模式基础】

✔ 特点:

  • 手动实现:主题维护一组观察者列表

  • 经典设计模式思想

  • 不依赖 Qt,可用于非 QObject 类

Qt 的信号槽就是观察者模式的升级版


✅ 4. 发布-订阅模式(Pub-Sub Pattern) 🗞️【带中介的观察者模式】

✔ 特点:

  • 和 Event Bus 类似,但更偏架构层

  • 可用于模块化插件系统或多线程模块通信

  • 可选中介:如 Qt 中心类、第三方消息库(如 eventpp


✅ 5. 自定义 QEvent + 事件投递机制(高级/底层)

✔ 特点:

  • 适合底层系统级事件、跨线程通信

  • 使用 QCoreApplication::postEvent() 发消息

  • 接收类需重写 QObject::event(QEvent* e)

QCoreApplication::postEvent(targetObject, new MyCustomEvent());

✅ 6. MVC/MVVM 架构分层

✔ 特点:

  • 把逻辑层(Model/ViewModel)和界面层(View)彻底分离

  • 使用信号/槽或绑定桥接

  • 更适合大型项目


✅ 7. 前后端分离架构(Frontend-Backend Separation)

✔ 模型

客户端-服务器通信模型 + RESTful API 或 WebSocket 通信协议

        C++ 后端作为服务,JS 前端通过 HTTPS 调用

  • 后端 C++:实现逻辑处理、设备管理、数据计算,暴露 API(通过 REST 或 WebSocket)

  • 前端 JS(如 Vue/React):调用后端接口、获取数据、展示 UI

  • 通信方式:通过 HTTP(S) 请求(GET/POST/PUT/DELETE)广义的发布-订阅模式(或请求-响应模式) 

通信例子(REST):

POST https://localhost:8000/api/update-angle
Content-Type: application/json{"angleX": 10.5,"angleY": -2.1
}

✔ 可选实现方式(C++ 服务端):

技术用途
Cpp-REST SDK(Casablanca)微软支持的 REST 服务框架
Crow / Drogon / Pistache高性能 C++ Web 框架
gRPC + Protobuf更高效的 RPC 通信,非 HTTP
Boost.Beast / ASIO低层 HTTP/WebSocket 支持


✅ 总结对比表:

✅ Qt 中前后端通信与解耦方式对比(含跨进程/语言)

方法解耦性使用难度推荐场景
信号与槽⭐⭐⭐⭐⭐⭐通用通信,Qt 内部模块、UI ↔ 逻辑
事件总线(MessageCenter)⭐⭐⭐⭐⭐⭐⭐⭐全局通知、广播事件,解耦多个模块
观察者模式⭐⭐⭐⭐⭐基础设计模式,适合无 Qt 场景
发布-订阅模式(带中介)⭐⭐⭐⭐⭐⭐⭐⭐插件系统、热插拔模块、多生产者消费者场景
QEvent 自定义⭐⭐⭐⭐⭐⭐⭐底层事件处理、跨线程通信、自定义事件类型
MVC / MVVM 架构⭐⭐⭐⭐⭐⭐⭐⭐⭐中大型应用的分层架构设计,逻辑与表现分离
前后端分离(C++ + JS + HTTPS)⭐⭐⭐⭐⭐⭐⭐⭐⭐跨语言/跨平台开发,Web UI 与本地后端通信


✅ 各方法适用范围速览:

方法是否跨模块是否跨语言是否适合大型项目是否线程安全
信号与槽✅(中小)✅(带 QueuedConnection
事件总线✅(需注意线程)
观察者模式❌(基础)❌(需手动实现)
发布-订阅❌(默认)✅(实现复杂)
QEvent 自定义✅(系统级)
MVC/MVVM❌(默认)✅✅
前后端分离(HTTPS)✅✅✅✅✅✅✅✅(通过 HTTP 协议)


✅ 推荐使用建议:

  • 🔧 轻量内部通信 → 用 Qt 自带的 信号与槽

  • 📢 多个模块响应同一事件 → 用 事件总线 / 发布-订阅

  • 🔋 需要插件式或热插拔功能 → 推荐 发布-订阅模式

  • ⚙️ 跨线程通信 → 使用 QEvent 自定义 + postEvent

  • 🧩 清晰结构、大型项目 → 使用 MVC/MVVM 架构

  • 🌐 前后端用不同语言(如 JS + C++) → 使用 前后端分离 + HTTPS 或 WebSocket


✅ Qt 多线程通信方法对比表

多线程环境下,模块通信和解耦机制就必须考虑以下几个关键因素:

  • 线程安全性(Thread Safety)

  • 🔁 事件能否跨线程分发

  • 🚧 使用复杂度 / 调试难度

  • 🧵 是否自动切换线程上下文(如 UI 线程)

方法跨线程能力线程安全性自动线程切换使用难度推荐场景(多线程)
信号与槽(QueuedConnection)✅(切 UI 线程)⭐⭐后台线程通知 UI,常用
事件总线(MessageCenter)⚠️(需额外处理)❌(默认) / ✅(加锁)⭐⭐⭐多模块通信,需加锁或用 queued signal
观察者模式⚠️⭐⭐不推荐直接用于多线程
发布-订阅模式(线程安全实现)✅(需封装)❌(或自处理)⭐⭐⭐⭐多线程模块解耦(如后台计算、日志分发)
QEvent 自定义 + postEvent()✅✅❌(需手动处理)⭐⭐⭐⭐跨线程消息队列,精准控制投递目标
MVC / MVVM 架构⚠️(依赖实现)⚠️(需要配合线程机制)⭐⭐⭐⭐与线程模型组合使用,如后台模型 + UI 表现
前后端分离(HTTPS/WebSocket)✅(多进程)✅(通过网络协议)❌(通过响应处理)⭐⭐⭐⭐前后端线程独立,由服务控制线程调度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87379.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

碰一碰发视频源码搭建定制化开发:支持OEM

在移动互联网与物联网深度融合的当下,“碰一碰发视频” 作为一种创新的信息交互方式,正逐渐应用于营销推广、产品展示、社交互动等多个领域。其核心在于通过近场通信技术(如 NFC、蓝牙)实现设备间的快速连接,无需复杂操…

机器学习文本特征提取:CountVectorizer与TfidfVectorizer详解

一、文本特征提取概述 在自然语言处理(NLP)和文本挖掘任务中,文本特征提取是将原始文本数据转换为机器学习模型可以理解的数值特征的关键步骤。scikit-learn提供了两种常用的文本特征提取方法:CountVectorizer(词频统…

【PHP】.Hyperf 框架-collection 集合数据(内置函数归纳-实用版)

📌 Article::query()->where(article_id, 6)->select()->first()✍️ 进行数据结果的循环,遍历 1.each() 方法遍历集合中的项目并将每个项目传递给闭包,进行处理数据 Article::query()->get()->each(function ($item) {// 可…

巨兽的阴影:大型语言模型的挑战与伦理深渊

当GPT-4这样的庞然大物能够流畅对话、撰写诗歌、编写代码、解析图像,甚至在某些测试中媲美人类专家时,大型语言模型(LLM)仿佛成为了无所不能的“智能神谕”。然而,在这令人目眩的成就之下,潜藏着复杂而严峻…

vue根据链接生成二维码 qrcode

vue根据链接生成二维码 qrcode js 需求&#xff1a;后端返回一个完整链接&#xff0c;前端根据链接生成一个二维码 1、安装qrcode插件 npm install qrcode2、引入qrcode,并且使用完整代码 <template> <div><img :src"qrcodeData" class"qrcode…

C# 事件(源代码组件概览)

源代码组件概览 需要在事件中使用的代码有5部分&#xff0c;如图15-4所示&#xff0c;后文会依次进行介绍。这些组件如下 所示 委托类型声明事件和事件处理程序必须有共同的签名和返回类型&#xff0c;它们通过委托类型 进行描述。事件处理程序声明订阅者类中会在事件触发时执…

音视频会议服务搭建(设计方案-数据库sql)-02

前言 衔接上篇文章&#xff0c;这篇是相关的表结构sql语句记录 EchoMeet 会议系统数据库表结构设计 &#x1f4cb; 设计概述 本文档定义了EchoMeet音视频会议系统的完整数据库表结构&#xff0c;采用微服务架构设计&#xff0c;支持高并发、可扩展的会议场景。 &#x1f3af…

MCPA2APPT 智能化演示文稿系统:A2A、MCP、ADK 三大架构全流程自动化

&#x1f680; 项目名称 MCPA2APPT / MultiAgentPPT —— 一站式 A2A MCP ADK 多智能体并发 PPT 生成解决方案 MCPA2APPT 是一款开源 AI PPT 创作神器&#xff0c;基于 A2A&#xff08;Ask-to-Answer&#xff09;、MCP&#xff08;Multi-agent Control Protocol&#xff09;和…

pyinstall打包mysql-connector-python后运行报错的问题!

简单的测试代码 # main.py import mysql.connectorDB_HOSTlocalhost DB_PORT3306 DB_NAMElover DB_USERroot DB_PASSWORDxxxx# 连接数据库 connection mysql.connector.connect(hostDB_HOST,portDB_PORT,databaseDB_NAME,userDB_USER,passwordDB_PASSWORD)if connection.is_c…

应对高并发:淘宝商品评论实时数据 API 高效接入开发实践

在电商平台的运营中&#xff0c;商品评论数据是用户决策、商家优化及平台运营的重要依据。淘宝作为国内领先的电商平台&#xff0c;其商品评论数据具有实时性强、数据量大、并发访问频繁等特点。本文将围绕淘宝商品评论实时数据 API 的高效接入展开&#xff0c;探讨在高并发场景…

踩坑日记:虚拟机桥接模式无法连接网卡

对于一名网安学生&#xff0c;我们渗透测试一般是需要虚拟机使用桥接模式。 但是vm直接设置成桥接模式并不能上网。还要进行如下配置 改一下这个桥接的地方。改成我们主机的网卡。 如何查看主机网卡呢&#xff1f; 设置搜索网络

Android 系统默认的Launcher3,Android 系统的导航栏(通常是屏幕底部)显示的 4 个快捷应用图标,如何替换这4个应用图标为客户想要的。

Android 系统默认的Launcher3, Android 系统的导航栏(通常是屏幕底部)显示的 4 个快捷应用图标, 如何替换这4个应用图标为客户想要的。 开发云 - 一站式云服务平台 按如下方式可以修改应用图标。 diff --git a/packages/apps/Launcher3/res/xml/default_workspace_5x6_no_a…

maker-pdf 文档文字识别,并用python实现

下面我将详细讲解maker-pdf文档文字识别的技术原理、特点&#xff0c;并提供完整的Python实现代码及优化方案。内容结合最新文档和OCR技术实践&#xff0c;适合开发者直接集成到项目中。 一、maker-pdf 核心技术解析 maker-pdf是基于深度学习的端到端OCR工具链&#xff0c;专…

Go基础(Gin)

go mod init my-gin-app 初始化一个 Go 项目&#xff0c;创建一个go.mod文件go mod tidy 自动整理项目依赖&#xff0c;确保go.mod和go.sum文件与代码实际使用的依赖一致go mod init&#xff1a;创建项目的 “依赖说明书”。go mod tidy&#xff1a;整理 “说…

21、鸿蒙学习——使用App Linking实现应用间跳转

简介 使用App Linking进行跳转时&#xff0c;系统会根据接口传入的uri信息&#xff08;HTTPS链接&#xff09;将用户引导至目标应用中的特定内容&#xff0c;无论应用是否已安装&#xff0c;用户都可以访问到链接对应的内容&#xff0c;跳转体验相比Deep Linking方式更加顺畅。…

Cursor无限邮箱续费方法

1.注册无限邮箱2925 2.“其他邮箱” 3.点击左下角添加邮箱 4.管理员身份运行Windos PowerShell 5.输入该指令并运行&#xff0c;修改机器码 irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/…

LeetCode Hot100(图论)

200. 岛屿数量 题意 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你…

Ubuntu Gnome 安装和卸载 WhiteSur-gtk-theme 类 Mac 主题的正确方法

WhiteSur-gtk-theme 是一个流行的 GNOME 桌面主题&#xff0c;可以让 Ubuntu 的桌面环境看起来像 macOS。以下是安装和卸载 WhiteSur-gtk-theme 的详细步骤&#xff0c;包括解释每个命令的作用。 一、安装 WhiteSur-gtk-theme 1. 准备工作 在安装主题之前&#xff0c;建议确…

如何在DataGear 5.4.1 中快速制作SQL服务端分页的数据表格看板

DataGear 数据可视化分析平台&#xff08;http://datagear.tech/&#xff09; 在新发布的5.4.1版本中&#xff0c;内置表格图表新增了serverSidePaging选项&#xff0c;仅需通过简单的配置&#xff0c;即可为表格添加服务端分页、关键字查询、排序功能。 本文以SQL数据集作为数…

股指期货套保比例怎么算?

在金融市场里&#xff0c;套期保值&#xff08;套保&#xff09;是一种常见的风险管理手段&#xff0c;目的是通过期货市场对冲现货市场的风险。而套保比例&#xff08;也叫套保比率&#xff09;的计算&#xff0c;是套保操作的核心。简单来说&#xff0c;套保比例就是“期货头…