Qt項目架構經驗總結

(一)通用規則

  1. 除了極小的微型demo級別項目外,其餘項目建議用pri分門別類不同文件夾存放代碼文件,方便統一管理和查找。
  2. 同類型功能的類建議統一放在一起,如果該目錄下代碼文件數量過多,也建議拆分多個目錄存放。
  3. 比如就3-5個界面的項目,統一搞個form.pri存放這些界面,而當項目越來越大,界面可能也需要按照功能劃分,比如系統配置的窗體放在一個目錄下,日誌管理的窗體放在一個目錄下。
  4. 很多通用功能,多個項目都會用到,可以考慮封裝成pri形式的模塊,俗稱輪子,不斷完善這些輪子,多個項目共享該模塊,一旦遇到BUG修復,只需要更改一個地方就行。
  5. 項目如果還更大或者項目組人員分配不同功能,可以考慮插件形式,插件一般會用到兩種,一種是普通動態庫形式的插件,必須和主程序放在一起;一種是Qt機制的插件,放在指定的目錄。

(二)全局配置文件

全局配置文件管理類 appconfig.h 用來讀寫對應項目的配置文件。

  1. 格式可以是ini、xml、json等,小項目建議ini,怎麼方便怎麼來,相當於將配置文件的值映射到全局變量。
  2. 配置文件如果配置項較多建議分組存儲方便查找,而不是全部放在一個大分組中。
  3. 讀配置文件的時候可以判斷配置文件是否存在、配置項是否缺失等情況,有問題則重新生成配置文件,避免惡意刪除配置文件導致程序運行異常。
  4. 讀配置文件的時候可以填入默認值(qt配置文件類QSettings的value方法的第二個參數,set.value("Hardware", App::Hardware)),避免初始時候讀取不到節點而導致配置項值不符合預期值類型。
  5. 讀配置文件完成後可以重新判斷配置項的值是否符合要求,對值進行過濾和矯正,防止人爲打開配置文件修改後填入了異常的值,比如定時器的間隔爲0,要重新糾正設定爲合法的值。
  6. 帶中文的初始值用QString::fromUtf8包起來,比如QString::fromUtf8("管理員")。
  7. 帶中文的配置項要設置配置文件編碼爲 utf-8,set.setIniCodec("utf-8")。

(三)全局變量

全局變量管理類 appdata.h 用來設置項目中用到的所有全局變量。

  1. 比如當前用戶/系統是否鎖定等,這樣可以在任意的編碼位置使用該變量進行判斷處理。
  2. 可以將UI界面中的導航欄寬高、按鈕大小、圖標大小等變量放在這,系統啓動後判斷分辨率等來設定不同的值。

(四)全局事件中轉處理

全局事件中轉處理類 appevent.h 用來中轉系統中各種跨多個UI以及多個類的事件。

  1. 此類必須是全局單例類,便於全局統一使用。
  2. 比如類a的父類是b,類b的父類是c,現在有個信號要發給類d,在沒有事件中轉處理的情況下的做法是將a信號發給b,b再發給c,c再發給d,如果父類嵌套層級越多越複雜,代碼越難管理。
  3. 將類a的信號發給appevent類,然後類d直接關聯appevent類進行處理就行。
  4. 項目越大,會越發現事件中轉處理的必要性,代碼清晰,管理方便。

(五)全局程序初始化

全局程序初始化類 appinit.h 用來做一些程序啓動後的初始化處理。

  1. 讀取配置文件。
  2. 設置全局字體。
  3. 設置全局樣式表,建議先讀取通用的樣式表,然後將額外的樣式表內容加到後面一起設置。
  4. 設置項目編碼。
  5. 設置翻譯文件,可以加載多個,包括qt內置的qt_zh_CN.qm,用戶自己的翻譯文件等。
  6. 初始化隨機數種子。
  7. 新建項目中需要的目錄,防止沒有目錄無法保存文件到目錄。
  8. 初始化數據庫,包括打開數據庫,載入基礎數據比如用戶表、設備表等。
  9. 啓動日誌輸出類用來啓動日誌服務。
  10. 啓動運行時間記錄類用來記錄每次軟件運行開始時間和結束時間。
  11. 關聯全局事件過濾器處理自定義無邊框UI拖動、全局按鍵處理等。

(六)全局通用類

  1. 調試日誌輸出類 savelog.h 用來啓動日誌服務,可以將日誌輸出到文件或者網絡打印輸出。
  2. 運行時間記錄類 saveruntime.h 用來記錄每次軟件運行開始時間和結束時間。
  3. 圖形字體類 iconfont.h 用來設置圖形字體圖標。

未完待續持續更新

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