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
英文地址,請注明出處:http://en.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;套保比例就是“期貨頭…