<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      我的 Qt 上位機(jī)項(xiàng)目 MVC 重構(gòu)日記

      # 我的 Qt 上位機(jī)項(xiàng)目 MVC 重構(gòu)日記
      日期: 2025-07-31


      前言

      今天我將把一個(gè)剛用 Qt Creator 17.0.0 + Qt 6.9.1 創(chuàng)建的 “Qt Widgets Application”——MyMonitorApp, 從 Qt Creator 默認(rèn)的文件組織方式(頭文件/源文件/界面文件三大 filter)改造成清晰的 MVC(Model–View–Controller)分層項(xiàng)目。


      一、項(xiàng)目初始狀態(tài)

      • Qt 版本:Qt 6.9.1

      • Creator 版本:17.0.0

      • 項(xiàng)目名稱:MyMonitorApp

      • 磁盤目錄結(jié)構(gòu)(通過(guò)“文件系統(tǒng)”視圖看到):

        MyMonitorApp/
        ├── MyMonitorApp.pro
        ├── headers/
        │   └── mainwindow.h
        ├── sources/
        │   ├── main.cpp
        │   └── mainwindow.cpp
        └── forms/
            └── mainwindow.ui
        
      • IDE “項(xiàng)目”視圖(邏輯分組,不是真實(shí)目錄):

        ├── 頭文件
        ├── 源文件
        └── 界面文件
        

      二、為什么要拆成 MVC?

      1. 職責(zé)分離

        • Model:負(fù)責(zé)管理和存儲(chǔ)數(shù)據(jù)。
        • View:只關(guān)心 UI 展示(.ui + 界面類實(shí)現(xiàn))。
        • Controller:處理業(yè)務(wù)邏輯、和下位機(jī)的串口/網(wǎng)絡(luò)通信。
      2. 可維護(hù)性

        • 功能模塊清晰,新同事可快速定位代碼。
      3. 可擴(kuò)展性

        • 增加新功能只要在對(duì)應(yīng)層新增文件夾,不影響其他層。

      三、重構(gòu)步驟

      1. 在磁盤上創(chuàng)建分層目錄

      cd MyMonitorApp
      mkdir model view controller util
      
      • model/:放 QAbstractItemModel 子類
      • view/:放所有 .ui + 對(duì)應(yīng)的 .h/.cpp
      • controller/:放業(yè)務(wù)邏輯與通訊類
      • util/:放串口管理、日志、配置等輔助工具

      2. 移動(dòng)文件

      # View 層
      mv headers/mainwindow.h    view/
      mv sources/mainwindow.cpp  view/
      mv forms/mainwindow.ui     view/
      
      # 根目錄下 main.cpp 保持不動(dòng)或按需放 controller/
      

      此時(shí)磁盤目錄變?yōu)椋?/p>

      MyMonitorApp/
      ├── model/
      ├── view/
      │   ├── mainwindow.h
      │   ├── mainwindow.cpp
      │   └── mainwindow.ui
      ├── controller/
      ├── util/
      ├── main.cpp
      └── MyMonitorApp.pro
      

      3. 修改 MyMonitorApp.pro

      打開(kāi)并編輯,將原來(lái)指向 headers/sources/forms/ 的條目全部替換成 MVC 目錄下的路徑:

       QT       += core gui widgets
       CONFIG   += c++17
      
      - INCLUDEPATH += $$PWD/headers
      + INCLUDEPATH += $$PWD/model \
      +                $$PWD/view \
      +                $$PWD/controller \
      +                $$PWD/util
      
      - HEADERS    += headers/mainwindow.h
      - SOURCES    += sources/main.cpp \
      -                sources/mainwindow.cpp
      - FORMS      += forms/mainwindow.ui
      
      + HEADERS += \
      +     view/mainwindow.h \
      +     model/DeviceDataModel.h \
      +     controller/DeviceController.h
      
      + SOURCES += \
      +     main.cpp \
      +     view/mainwindow.cpp \
      +     model/DeviceDataModel.cpp \
      +     controller/DeviceController.cpp
      
      + FORMS += \
      +     view/mainwindow.ui
      

      小提醒:IDE “項(xiàng)目”視圖里的 “頭文件/源文件/界面文件” 只是 qmake filter,不影響真實(shí)目錄。

      4. 在 Qt Creator 中驗(yàn)證

      1. 打開(kāi)項(xiàng)目:MyMonitorApp.pro
      2. 切換到 “文件系統(tǒng)” 視圖,確認(rèn)只剩下 model/view/controller/util/
      3. “構(gòu)建→清理項(xiàng)目 → 運(yùn)行 QMake → 編譯”

      四、代碼骨架示例

      1. Model

      // model/DeviceDataModel.h
      #pragma once
      #include <QAbstractTableModel>
      #include "DeviceItem.h"
      
      class DeviceDataModel : public QAbstractTableModel {
          Q_OBJECT
      public:
          explicit DeviceDataModel(QObject* parent = nullptr);
          int rowCount(...) const override;
          int columnCount(...) const override;
          QVariant data(...) const override;
          void appendData(const DeviceItem& item);
      private:
          QVector<DeviceItem> m_items;
      };
      

      2. Controller

      // controller/DeviceController.h
      #pragma once
      #include <QObject>
      #include "model/DeviceDataModel.h"
      #include "util/SerialPortManager.h"
      
      class DeviceController : public QObject {
          Q_OBJECT
      public:
          DeviceController(DeviceDataModel* model, QObject* parent = nullptr);
      private slots:
          void onSerialDataReceived(const QByteArray& raw);
      private:
          DeviceDataModel* m_model;
          SerialPortManager m_serial;
      };
      

      3. View

      <!-- view/mainwindow.ui -->
      <ui version="4.0">
        <class>MainWindow</class>
        <!-- … -->
      </ui>
      
      // view/mainwindow.cpp
      #include "mainwindow.h"
      #include "ui_mainwindow.h"
      MainWindow::MainWindow(QWidget *parent)
          : QMainWindow(parent)
          , ui(new Ui::MainWindow)
      {
          ui->setupUi(this);
          m_model = new DeviceDataModel(this);
          ui->tableView->setModel(m_model);
          m_ctrl  = new DeviceController(m_model, this);
      }
      

      五、心得與建議

      • IDE 視圖 vs 文件系統(tǒng)

        • “項(xiàng)目”視圖便于按文件類型快速定位;
        • “文件系統(tǒng)”視圖才映射真實(shí)目錄結(jié)構(gòu)。
      • 分層不分味

        • 小項(xiàng)目可以不嚴(yán)格三層都寫(xiě),按需增刪;
        • 大項(xiàng)目建議在各層內(nèi)部再做二級(jí)模塊劃分。
      • 版本管理

        • 重構(gòu)后別忘了更新 .gitignore(移除舊目錄引用)。

      重構(gòu)完畢后,MyMonitorApp 的目錄變得干凈整齊,邏輯分層清晰,后續(xù)新增功能或移植到嵌入式 Qt 時(shí)都省心不少。希望這篇日記對(duì)你也有幫助!

      posted @ 2025-07-31 11:01  阿坦  閱讀(49)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: a级黑人大硬长爽猛出猛进| 无码抽搐高潮喷水流白浆| 东方四虎在线观看av| 欧洲精品色在线观看| 麻豆成人精品国产免费| 亚洲国产中文字幕精品| 欧美人与动牲交A免费观看| 中文字幕无码不卡免费视频| 国产精品日韩av一区二区| 日韩精品 在线 国产 丝袜| 成人国产精品免费网站| 国产成人无码www免费视频播放| 久久老熟妇精品免费观看| 成人深夜节目在线观看| 亚洲成在人线AV品善网好看| 一面膜上边一面膜下边视频| 久久大香伊蕉在人线免费AV | 亚洲在av极品无码天堂| 免费人成视频在线观看不卡| 中文在线天堂中文在线天堂| 在线日韩日本国产亚洲| 日本午夜精品一区二区三区电影 | 无码少妇一区二区| 自拍偷拍第一区二区三区| 桐乡市| 色偷偷亚洲精品一区二区| 麻豆亚洲精品一区二区| 韩国三级在线 中文字幕 无码| 曝光无码有码视频专区| AV无码免费不卡在线观看| A级毛片100部免费看| 成人网站免费看黄a站视频| 国产精品人妻久久ai换脸| 亚洲欧美日韩成人综合一区| 渭南市| 亚洲第一最快av网站| 午夜av高清在线观看| 浑源县| 免费无码高H视频在线观看| 最近2019中文字幕免费看| 黑人玩弄人妻中文在线|