基於Qt軟件框架設計

1、引子

Qt,在很多人的認識裏是一個做界面的框架,只用來做界面,而後端往往是用別的來實現。在本人的實踐中, 我把界面與後端的實現都用Qt來實現了。

2、軟件分層

一般來說,我們的軟件架構會很成很多層,這裏我們分三層就夠 了,分層如下圖所示:

2.1 GUI層

這裏我們由於基於Qt的,所以這一層都是用Qt的類庫來實現了,所有的主界面都會從這三個類:QWiget,QMainWindow,QDialog中的一個繼承而來,並在main函數裏生成實例並show出來,進入主消息循環。我本人習慣於使用QWiget,不使用UI文件,所有的界面都new出來,再使用代碼來佈局。

2.2 Models層

model層主要實現我們的軟件的業務邏輯,這裏的模塊因整個軟件的業務邏輯來合理劃分模塊,達到高內聚鬆耦合的效果。在這裏我們就涉及到一個這些業務邏輯類,在那裏new出來的問題了。我的做法是:做一個bridge類,讓所有的業務邏輯類都在這個bridge類裏實例化。

2.3 Communication 層

這一層的話就是實現對數據的採集了,通信 的方式 有多種多樣,有串口,有網口,有CAN口等。這一層收到的數據向models層發,用戶的輸入也通過這一層向執行機構發。

那麼這一層的類,在那裏實例化呢?我同樣選擇在bridge類裏,這樣,bridge類其實是一個什麼業務功能都沒有的類,只是提供了各個類之間可以相互connect(信號槽)的載體。

3、 下層與GUI層的溝通

至此,我們的除GUI層的類(通信與模塊)都在bridge類裏能通過信號槽的機制溝通起來了。那麼我們的的模型怎麼和GUI進行通信呢?

我們可以通過這個bridge類來進行,因爲我們的其它 的類都是在bridge類裏進行實例化的,所以這個類裏可以擁有類的引用,我們可以在QWidget裏的構造函數裏傳一個bridge類的指針進去,這樣,我們的所有類,都可以和GUI進行通信了。

4、運行架構

當我們把所有的層次的代碼都設計好了,並且知道在那個類裏,那個層級來實現後,我們要使用線程讓整個軟件歡快的運行進來 。這就是我們要說的運行架構。

一般而言,我們把所有的communication的類都 會單獨出來成爲一個線程,這樣,不會阻塞GUI線程,也能夠更快的響應採集信息和向下位機傳遞控制信息。

所以communication這一層,一般有幾個端口就會有幾個線程。當然有些比較輕量級的可以合在一個線程裏。

bridge類收到GUI線程裏,爲什麼要這麼做呢,我們界面彈出來時,要從model裏get最新的值顯示在界面上,(用信號槽實現也可以但是會顯得比較繁瑣),所以要調用get的方法,有這樣的需求, 我們最好把所有的model都放到一個線程裏——-即GUI線程。

這樣我們的一個小型的信息採集與控制系統的主框架就搭建好了。

最後強調一點的是:當使用線程時建議使用movetothread的方法。如果不使用這個方法的話,所有的實例都必須在線程的run()函數裏new出來,才能保證這個類的槽函數在這個線程的消息循環裏執行。
--------------------- 
作者:amwha 
來源:CSDN 
原文:https://blog.csdn.net/amwha/article/details/73928281 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章