فهرست منبع

this is new version code

Change-Id: I4de20369a9318523f5135306984101e0d33139c7
ren_chaolun* 4 ماه پیش
والد
کامیت
e9b0b5b527
44فایلهای تغییر یافته به همراه5560 افزوده شده و 474 حذف شده
  1. 1 1
      CInterface.h
  2. 18 7
      CameraMaterialGroupWnd/CameraImage/CameraImageHandler.cpp
  3. 3 0
      CameraMaterialGroupWnd/CameraImage/CameraImageHandler.h
  4. 20 6
      CameraMaterialGroupWnd/Group.cpp
  5. 4 0
      CameraMaterialGroupWnd/Group.h
  6. 30 0
      CameraMaterialGroupWnd/MaterialWindow/DieItem.cpp
  7. 32 0
      CameraMaterialGroupWnd/MaterialWindow/DieItem.h
  8. 141 60
      CameraMaterialGroupWnd/MaterialWindow/Wafer.cpp
  9. 47 5
      CameraMaterialGroupWnd/MaterialWindow/Wafer.h
  10. 75 0
      CameraMaterialGroupWnd/MaterialWindow/WaferGraphicsView.cpp
  11. 29 0
      CameraMaterialGroupWnd/MaterialWindow/WaferGraphicsView.h
  12. 14 3
      ImageWidget.cpp
  13. 4 2
      ImageWidget.h
  14. 16 2
      Login.cpp
  15. 4 2
      Login.h
  16. 294 8
      MainWnd.cpp
  17. 19 8
      MainWnd.h
  18. 158 9
      OriginalWnd/ChartsAndCamerasWnd.cpp
  19. 10 3
      OriginalWnd/ChartsAndCamerasWnd.h
  20. 67 0
      OriginalWnd/ChartsAndCamerasWnd.ui
  21. 2743 0
      OriginalWnd/DbTreeViewManager.cpp
  22. 459 0
      OriginalWnd/DbTreeViewManager.h
  23. 112 16
      OriginalWnd/MainAndSecondaryCamerasWnd.cpp
  24. 6 2
      OriginalWnd/MainAndSecondaryCamerasWnd.h
  25. 64 0
      OriginalWnd/MainAndSecondaryCamerasWnd.ui
  26. 18 0
      OriginalWnd/NonInteractiveCheckDelegate.h
  27. 116 65
      OriginalWnd/OriginalWnd.cpp
  28. 24 11
      OriginalWnd/OriginalWnd.h
  29. 1 1
      OriginalWnd/OriginalWnd.ui
  30. 151 32
      OriginalWnd/SingleCameraOperationWnd.cpp
  31. 6 2
      OriginalWnd/SingleCameraOperationWnd.h
  32. 64 0
      OriginalWnd/SingleCameraOperationWnd.ui
  33. 4 4
      OriginalWnd/chartline.cpp
  34. 15 7
      SBTdie-bonder-ui.pro
  35. 16 208
      SBTdie-bonder-ui.pro.user
  36. BIN
      configurations.db
  37. 592 0
      dark.qss
  38. 128 0
      gen_interface.cpp
  39. 20 0
      gen_interface.h
  40. BIN
      images/check_selected.png
  41. BIN
      images/home_left_hide.png
  42. BIN
      images/home_right_show.png
  43. 32 2
      main.cpp
  44. 3 8
      res.qrc

+ 1 - 1
CInterface.h

@@ -57,7 +57,7 @@ typedef struct _CONFIG_BASE_STRUCT
     int iGroupId;
     string strName;
     string strDescribe;
-    int iUserGrade;
+    int iUserGradee;
     int iChangeFlag;
     string strValue;
     string strType;

+ 18 - 7
CameraMaterialGroupWnd/CameraImage/CameraImageHandler.cpp

@@ -1,4 +1,4 @@
-#include "CameraImageHandler.h"
+#include "CameraImageHandler.h"
 #include "CameraMaterialGroupWnd/Group.h"
 #include "CInterface.h"
 
@@ -7,15 +7,18 @@ CameraImageHandler::CameraImageHandler(int iCameraId) {
 }
 
 void CameraImageHandler::captureAndConvertImage(int iCameraId) {
-    CInterface interface;
-    ImageInfo image;
 
-    long result = interface.GrabImage(iCameraId, image);
+    // CInterface interface;
+    // ImageInfo image;
 
-    if (result == 0) {
-        initGroup(iCameraId);
-    }
+    // long result = interface.GrabImage(iCameraId, image);
 
+    // if (result == 0) {
+    //     initGroup(iCameraId);
+    // }
+
+
+     initGroup(iCameraId);
     // if (result == 0) {
     //     qDebug() << "Image width: " << image.width;
     //     qDebug() << "Image height: " << image.height;
@@ -52,6 +55,10 @@ Group* CameraImageHandler::getGroup() const {
     return group;
 }
 
+Wafer* CameraImageHandler::getWafer() const{
+    return wafer;
+}
+
 void CameraImageHandler::initGroup(int CameraId) {
     QStringList dispmodel1;
     dispmodel1 << "P die align" << "D device align";
@@ -66,6 +73,7 @@ void CameraImageHandler::initGroup(int CameraId) {
     dispmodel4 << "U die align" << "D device align";
 
     if (CameraId == 1) {
+        wafer = new Wafer(0);
         group = new Group(CameraId, ":/images/test_image/image_1.png", MaterialWindowType, dispmodel1, this);
     } else if (CameraId == 2) {
         MaterialWindowType = 2;
@@ -74,8 +82,10 @@ void CameraImageHandler::initGroup(int CameraId) {
         MaterialWindowType = 3;
         group = new Group(CameraId, ":/images/test_image/image_5.png", MaterialWindowType, dispmodel3, this);
     } else if (CameraId == 4) {
+        wafer = new Wafer(0);
         group = new Group(CameraId, ":/images/test_image/image_7.png", MaterialWindowType, dispmodel4, this);
     } else if (CameraId == 5) {
+        wafer = new Wafer(0);
         group = new Group(CameraId, ":/images/test_image/image_1.png", MaterialWindowType, dispmodel1, this);
     } else if (CameraId == 6) {
         MaterialWindowType = 2;
@@ -84,6 +94,7 @@ void CameraImageHandler::initGroup(int CameraId) {
         MaterialWindowType = 3;
         group = new Group(CameraId, ":/images/test_image/image_5.png", MaterialWindowType, dispmodel3, this);
     } else if (CameraId == 8) {
+        wafer = new Wafer(0);
         group = new Group(CameraId, ":/images/test_image/image_7.png", MaterialWindowType, dispmodel4, this);
     } else {
         group = nullptr; // 如果 CameraId 不匹配,则 group 为 nullptr

+ 3 - 0
CameraMaterialGroupWnd/CameraImage/CameraImageHandler.h

@@ -1,6 +1,7 @@
 #ifndef CAMERAIMAGEHANDLER_H
 #define CAMERAIMAGEHANDLER_H
 #include "CameraMaterialGroupWnd/Group.h"
+#include "CameraMaterialGroupWnd/MaterialWindow/Wafer.h"
 
 
 class CameraImageHandler : public QWidget {
@@ -9,11 +10,13 @@ public:
     CameraImageHandler(int iCameraId);
 
     Group* getGroup() const;
+    Wafer* getWafer() const;
 
 private:
     void captureAndConvertImage(int CameraId);
     Group* group;  // 存储 Group 对象的容器
     void initGroup(int CameraId);
+    Wafer* wafer;
 
     int MaterialWindowType = 1; // 物料窗口类型标识,1代表圆晶 后面接口获取标识
 };

+ 20 - 6
CameraMaterialGroupWnd/Group.cpp

@@ -4,7 +4,7 @@
 #include <QMouseEvent>
 #include <QSettings>
 #include <QVBoxLayout>
-
+#include <QLabel>
 
 Group::Group(int Id, const QString& imagePath1, int MaterialWindowType, const QStringList& textList, QWidget* parent)
     : QWidget(parent), ui(new Ui::Group) {
@@ -14,11 +14,19 @@ Group::Group(int Id, const QString& imagePath1, int MaterialWindowType, const QS
     ui->Imagewidget_left->setPixmap(pixmap1);
 
     ui->DatacomboBox->addItems(textList);
-
+    ui->GroupButton->setStyleSheet(   // 设置样式表
+                           "QPushButton:hover {"
+                           "   background-color: #45a049;"  // 悬停时的背景颜色
+                           "}"
+                           "QPushButton:pressed {"
+                           "   background-color: #3e8e41;"  // 点击时的背景颜色
+                           "}"
+                           );
     ui->Imagewidget_left->setProperty("groupId", Id);
     ui->Imagewidget_right->setProperty("groupId", Id);
 
     if (MaterialWindowType == 1) { // 判断物料窗口类型,转到处理函数
+        wafer = new Wafer(0, ui->Imagewidget_right);
         WaferWidget();
     } else if (MaterialWindowType == 2) {
         WaffleWidget();
@@ -28,7 +36,7 @@ Group::Group(int Id, const QString& imagePath1, int MaterialWindowType, const QS
 
     // 存储参数到 QSettings
     saveGroupSettings(Id, imagePath1, MaterialWindowType, textList);
-
+    connect(ui->GroupButton,&QPushButton::clicked,this,&Group::onclickbutton);
     initForm();
 }
 
@@ -48,7 +56,6 @@ bool Group::eventFilter(QObject *obj, QEvent *event) {
             int groupId = obj->property("groupId").toInt();
             QSettings settings("YourCompany", "YourApplication_");
             settings.setValue("GroupId", groupId);
-
             if (obj == this->ui->Imagewidget_left) {
                 settings.setValue("Index", 1);
             } else if (obj == this->ui->Imagewidget_right) {
@@ -72,12 +79,15 @@ void Group::saveGroupSettings(int Id, const QString& imagePath1, int materialWnd
 // 圆晶
 void Group::WaferWidget() {
     QVBoxLayout *layout2 = new QVBoxLayout(ui->Imagewidget_right);
-    wafer = new Wafer(0, ui->Imagewidget_right);
+    wafer->paintInitFrom(ui->Imagewidget_right);
+
+    QLabel* pixmapLabel = new QLabel();
+    pixmapLabel->setPixmap(wafer->getGlobalPixmap());
 
     ui->Imagewidget_right->setLayout(layout2);
     ui->Imagewidget_right->setFixedSize(114, 114);
     layout2->setContentsMargins(0, 0, 0, 0);
-    layout2->addWidget(wafer);
+    layout2->addWidget(pixmapLabel);
 }
 
 // 华夫盒
@@ -101,3 +111,7 @@ void Group::MaterialBoxWidget() {
     layout2->setContentsMargins(0, 0, 0, 0);
     layout2->addWidget(materialbox);
 }
+
+void Group::onclickbutton(){
+    sendSignal();
+}

+ 4 - 0
CameraMaterialGroupWnd/Group.h

@@ -23,6 +23,10 @@ public:
     bool eventFilter(QObject *obj, QEvent *event);
     void saveGroupSettings(int Id, const QString& imagePath1, int materialWndType, const QStringList& textList);
 
+signals:
+    void sendSignal();
+public slots:
+    void onclickbutton();
 protected:
     void WaferWidget(); // 圆晶
     void WaffleWidget(); // 华夫盒

+ 30 - 0
CameraMaterialGroupWnd/MaterialWindow/DieItem.cpp

@@ -0,0 +1,30 @@
+#include "DieItem.h"
+#include <QPen>
+
+DieItem::DieItem(int row, int col, PICK_DIE_STATUS status, qreal size, QGraphicsItem* parent)
+    : QGraphicsRectItem(parent), row(row), col(col), status(status) {
+    setRect(0, 0, size, size); // 设置单元格大小
+    setBrush(getColorByStatus(status));
+
+    // 设置边框(Pen)
+    setPen(QPen(QColor(0, 0, 0), 0.5)); // 黑色边框,宽度为0.5
+}
+
+QColor DieItem::getColorByStatus(PICK_DIE_STATUS status) {
+    switch (status) {
+    case DIE_EXIST: return QColor(0, 102, 255); // 蓝色
+    case NO_EXIST: return QColor(200, 200, 200); // 浅灰
+    case PICK_ING: return QColor(255, 255, 0); // 黄色
+    case SKIP_DIE: return QColor(128, 128, 128); // 深灰
+    case EDGE_DIE: return QColor(255, 165, 0); // 橙色
+    default: return QColor(0, 0, 0);
+    }
+}
+
+int DieItem::getRow() const {
+    return row;
+}
+
+int DieItem::getCol() const {
+    return col;
+}

+ 32 - 0
CameraMaterialGroupWnd/MaterialWindow/DieItem.h

@@ -0,0 +1,32 @@
+#ifndef DIEITEM_H
+#define DIEITEM_H
+
+#include <QGraphicsRectItem>
+#include <QColor>
+
+enum PICK_DIE_STATUS {
+    DIE_EXIST,/*原来的*/
+    PICK_ING,/*正在取*/
+    NO_EXIST,/*已取走*/
+    SKIP_DIE,/*跳过的点*/
+    EDGE_DIE /*边缘无效*/
+};
+
+// 自定义矩形代表晶圆单元格
+class DieItem : public QGraphicsRectItem {
+public:
+    DieItem(int row, int col, PICK_DIE_STATUS status, qreal size, QGraphicsItem* parent = nullptr);
+
+    // 获取单元格的行列号
+    int getRow() const;
+    int getCol() const;
+
+private:
+    int row, col;
+    PICK_DIE_STATUS status;
+
+    // 获取单元格状态颜色
+    QColor getColorByStatus(PICK_DIE_STATUS status);
+};
+
+#endif // DIEITEM_H

+ 141 - 60
CameraMaterialGroupWnd/MaterialWindow/Wafer.cpp

@@ -2,80 +2,161 @@
 #include <QPainter>
 #include <QPaintEvent>
 #include <cmath>
+#include <QDebug>
+#include <QPushButton>
+#include <QGridLayout>
 
 Wafer::Wafer(int flag, QWidget *parent) : QWidget(parent) {
-    waferData = {
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
-        {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0},
-        {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0},
-        {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
-        {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
-        {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
-        {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
-        {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
-        {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
-        {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
-        {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
-        {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
-        {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0},
-        {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0},
-        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
-    };
-
-    // 根据不同窗口设置不同大小 0:小 1:中 2:大
-    if (flag == 0) {
-        num = 9;
-    } else if (flag == 1) {
-        num = 15;
-    } else if (flag == 2) {
-        num = 21;
+    Flag = flag;
+    rows = 50;
+    cols = 50;
+    centerX = 25;
+    centerY = 25;
+    radius = 25;
+
+    // 随机数初始化
+    std::srand(std::time(nullptr)); // 使用当前时间作为种子
+
+    // 遍历矩阵,按行列判断是否在圆形区域内
+    for (int row = 0; row < rows; ++row) {
+        for (int col = 0; col < cols; ++col) {
+            // 计算当前点到中心点的距离
+            double dx = col - centerX;
+            double dy = row - centerY;
+            double distance = std::sqrt(dx * dx + dy * dy);
+
+            // 如果点在圆形区域外部,跳过
+            if (distance > radius) {
+                continue;
+            }
+
+            // 创建一个新的WAFER_MATRIX_POINT_INFO_STRUCT
+            WAFER_MATRIX_POINT_INFO_STRUCT point;
+            point.nDieMatrixId = 1; // 假设所有点属于同一晶圆矩阵
+            point.nDieRow = row;
+            point.nDieCol = col;
+            point.iDieIndex = row * cols + col; // 假设ID为行列号的线性映射
+            point.bDisable = false; // 默认为可用
+            point.stPosition.x = col * 10.0;
+            point.stPosition.y = row * 10.0;
+
+            // 判断该点是否在圆形区域的边缘
+            if (distance > radius - 1 && distance < radius + 1) {
+                point.eStatus = EDGE_DIE; // 如果在边缘区域,状态设置为EDGE_DIE
+            } else {
+                // 如果在圆形区域内,随机设置其他状态
+                int randomStatus = std::rand() % 4; // 随机选取DIE_EXIST, PICK_ING, NO_EXIST, SKIP_DIE
+                point.eStatus = static_cast<PICK_DIE_STATUS>(randomStatus);
+            }
+
+            // 将点添加到waferData容器中
+            waferData.append(point);
+        }
     }
 }
 
-void Wafer::paintEvent(QPaintEvent *event) {
-    QPainter painter(this);
+QColor Wafer::getColorByStatus(PICK_DIE_STATUS status) {
+    switch (status) {
+    case DIE_EXIST: return QColor(0, 102, 255); // 蓝色
+    case NO_EXIST: return QColor(200, 200, 200); // 浅灰
+    case PICK_ING: return QColor(255, 255, 0); // 黄色
+    case SKIP_DIE: return QColor(128, 128, 128); // 深灰
+    case EDGE_DIE: return QColor(255, 165, 0); // 橙色
+    default: return QColor(0, 0, 0); // 默认黑色
+    }
+}
 
+void Wafer::paintInitFrom(QWidget *parent) {
 
+    // 获取当前窗口的宽高
+    int width = parent->width();
+    int height = parent->height();
 
-    // 抗锯齿效果
-    painter.setRenderHint(QPainter::Antialiasing);
+    // 根据行列数计算每个晶圆点的大小,选择小的边来决定
+    int cellSize = qMin(width, height) / qMax(rows, cols); // 固定大小为正方形,按最小边计算
 
-    // 绘制背景
-    painter.fillRect(this->rect(), Qt::white);
+    // 计算左上角偏移量,居中显示
+    int offsetX = (width - cellSize * cols) / 2;
+    int offsetY = (height - cellSize * rows) / 2;
 
-    // 定义晶圆的整体圆形
-    int diameter = qMin(width(), height()) - num; // 确保圆形不会超出窗口边界
-    int centerX = width() / 2;
-    int centerY = height() / 2;
-    QRect waferRect(centerX - diameter / 2, centerY - diameter / 2, diameter, diameter);
+    // 创建一个 QPixmap 对象用于保存绘制的图像
+    globalPixmap = QPixmap(width, height);
+    globalPixmap.fill(Qt::white);  // 填充背景色为白色
 
-    // 绘制晶圆圆形边界
-    painter.setPen(Qt::gray);
-    painter.drawEllipse(waferRect);
+    // 创建 QPainter 以绘制到 QPixmap 上
+    QPainter painter(&globalPixmap);
+    painter.setRenderHint(QPainter::Antialiasing); // 启用抗锯齿
 
-    // 绘制二维数组表示的晶圆图案
-    int rows = waferData.size();
-    int cols = waferData[0].size();
-    int cellSize = diameter / qMax(rows, cols); // 根据晶圆大小动态调整单元格大小
+    // 设置画笔为无边框
+    painter.setPen(Qt::NoPen);
 
-    int radiusSquared = (diameter / 2) * (diameter / 2);
+    // 绘制每个晶圆点
+    for (int i = 0; i < waferData.size(); ++i) {
+        int x = offsetX + waferData[i].nDieCol * cellSize;
+        int y = offsetY + waferData[i].nDieRow * cellSize;
 
-    for (int i = 0; i < rows; ++i) {
-        for (int j = 0; j < cols; ++j) {
-            if (waferData[i][j] == 1) { // 如果格点状态为 1,则填充颜色
-                int x = centerX - diameter / 2 + j * cellSize;
-                int y = centerY - diameter / 2 + i * cellSize;
-                QRect cellRect(x, y, cellSize, cellSize);
+        // 根据点的状态设置颜色
+        painter.setBrush(getColorByStatus(waferData[i].eStatus));
 
-                // 判断是否在圆形范围内
-                int distanceSquared = pow(x + cellSize / 2 - centerX, 2) + pow(y + cellSize / 2 - centerY, 2);
-                if (distanceSquared <= radiusSquared) {
-                    painter.fillRect(cellRect, Qt::blue);
-                    // 绘制边框
-                    painter.setPen(Qt::gray);
-                    painter.drawRect(cellRect);
-                }
-            }
-        }
+        // 绘制晶圆点(每个点是一个矩形)
+        painter.drawRect(x, y, cellSize, cellSize);
+    }
+
+    painter.end(); // 结束绘制
+}
+
+void Wafer::initFrom(QWidget *parent) {
+    scene = new QGraphicsScene(parent);
+    view = new WaferGraphicsView(scene);
+
+    // 获取当前窗口的宽高
+    int width = parent->width();
+    int height = parent->height();
+
+    // 根据行列数计算每个晶圆点的大小,选择小的边来决定
+    int cellSize = qMin(width, height) / qMax(rows, cols); // 固定大小为正方形,按最小边计算
+
+    for (int i = 0; i < waferData.size(); ++i) {
+        DieItem* die = new DieItem(waferData[i].nDieRow, waferData[i].nDieCol, waferData[i].eStatus, cellSize);
+        die->setPos(waferData[i].nDieCol * cellSize, waferData[i].nDieRow * cellSize);
+        scene->addItem(die);
     }
+
+    view->setSceneRect(scene->itemsBoundingRect());
+    view->resize(width, height);
+}
+
+QPixmap Wafer::getGlobalPixmap() const {
+    return globalPixmap;
+}
+
+void Wafer::showContextMenu(const QPoint &pos) {
+    if (!contextMenu) {
+        contextMenu = new QMenu(this);
+
+        // 创建菜单项
+        QAction *action1 = new QAction("菜单项 1", this);
+        QAction *action2 = new QAction("菜单项 2", this);
+
+        // 将菜单项添加到菜单
+        contextMenu->addAction(action1);
+        contextMenu->addAction(action2);
+
+        // 连接菜单项的信号到槽函数
+        connect(action1, &QAction::triggered, this, &Wafer::handleAction1);
+        connect(action2, &QAction::triggered, this, &Wafer::handleAction2);
+    }
+
+    // 显示菜单
+    contextMenu->exec(QCursor::pos());
+}
+
+void Wafer::handleAction1() {
+    // 处理菜单项 1 的逻辑
+    qDebug() << "菜单项 1 被点击";
+}
+
+void Wafer::handleAction2() {
+    // 处理菜单项 2 的逻辑
+    qDebug() << "菜单项 2 被点击";
 }

+ 47 - 5
CameraMaterialGroupWnd/MaterialWindow/Wafer.h

@@ -3,19 +3,61 @@
 
 #include <QWidget>
 #include <vector>
+#include <QMenu>
+#include "WaferGraphicsView.h"
+#include "DieItem.h"
+
+typedef struct
+{
+    double x;
+    double y;
+}XY_DOUBLE_STRUCT;
+
+typedef struct
+{
+    int nDieMatrixId;							//晶圆矩阵Id
+    int nDieRow;								//固晶点在矩阵中所在行
+    int nDieCol;								//固晶点在矩阵中所在列
+    int iDieIndex;								//所在Point点ID
+    bool bDisable;								//不可用点,等同于无效点
+    PICK_DIE_STATUS eStatus;					//晶片状态
+    XY_DOUBLE_STRUCT stPosition;				//程序设置的位置
+} WAFER_MATRIX_POINT_INFO_STRUCT;
 
 class Wafer : public QWidget
 {
+    Q_OBJECT
+
 public:
-    Wafer(int flag, QWidget *parent = nullptr);
+    explicit Wafer(int flag, QWidget *parent = nullptr);
+
+    void initFrom(QWidget *parent);
+    void paintInitFrom(QWidget *parent);
+    QPixmap getGlobalPixmap() const;
+    QWidget *globalWidget;
+
+    QColor getColorByStatus(PICK_DIE_STATUS status);
+    QGraphicsScene* scene;
+    WaferGraphicsView *view;
 
 protected:
-    void paintEvent(QPaintEvent *event) override;
 
-private:
-    std::vector<std::vector<int>> waferData; // 二维数组存储晶圆数据
+private slots:
+    void handleAction1();
+    void handleAction2();
 
-    int num;
+signals:
+    void sendCoordinates(int x, int y);
+
+private:
+    int Flag;
+    void showContextMenu(const QPoint &pos);
+    QVector<WAFER_MATRIX_POINT_INFO_STRUCT> waferData;
+    int rows, cols;
+    int centerX, centerY;
+    qreal radius;
+    QMenu *contextMenu = nullptr;
+    QPixmap globalPixmap;
 };
 
 #endif // WAFER_H

+ 75 - 0
CameraMaterialGroupWnd/MaterialWindow/WaferGraphicsView.cpp

@@ -0,0 +1,75 @@
+#include "WaferGraphicsView.h"
+#include <QDebug>
+
+WaferGraphicsView::WaferGraphicsView(QGraphicsScene* scene, QWidget* parent)
+    : QGraphicsView(scene, parent), selecting(false), selectionRect(nullptr), scaleFactor(1.0) {
+    setRenderHint(QPainter::Antialiasing);
+    setDragMode(QGraphicsView::ScrollHandDrag); // 支持拖动视图
+}
+
+// void WaferGraphicsView::mousePressEvent(QMouseEvent* event) {
+//     if (event->button() == Qt::LeftButton) {
+//         // 开始框选
+//         selecting = true;
+//         selectionStart = mapToScene(event->pos());
+//         if (!selectionRect) {
+//             selectionRect = new QGraphicsRectItem();
+//             selectionRect->setPen(QPen(Qt::DashLine));
+//             selectionRect->setBrush(QBrush(QColor(0, 0, 255, 50))); // 半透明蓝色
+//             scene()->addItem(selectionRect);
+//         }
+//         selectionRect->setRect(QRectF(selectionStart, QSizeF()));
+//     }
+//     QGraphicsView::mousePressEvent(event);
+// }
+
+// void WaferGraphicsView::mouseMoveEvent(QMouseEvent* event) {
+//     if (selecting && selectionRect) {
+//         QPointF currentPos = mapToScene(event->pos());
+//         selectionRect->setRect(QRectF(selectionStart, currentPos).normalized());
+//     }
+//     QGraphicsView::mouseMoveEvent(event);
+// }
+
+// void WaferGraphicsView::mouseReleaseEvent(QMouseEvent* event) {
+//     if (event->button() == Qt::LeftButton && selecting) {
+//         selecting = false;
+//         if (selectionRect) {
+//             QRectF selectedArea = selectionRect->rect();
+//             scene()->removeItem(selectionRect);
+//             delete selectionRect;
+//             selectionRect = nullptr;
+
+//             // 输出选中区域内的晶圆信息
+//             QList<QGraphicsItem*> items = scene()->items(selectedArea, Qt::IntersectsItemShape);
+//             qDebug() << "Selected Dies:";
+//             for (QGraphicsItem* item : items) {
+//                 DieItem* die = dynamic_cast<DieItem*>(item);
+//                 if (die) {
+//                     qDebug() << "Row:" << die->getRow() << "Col:" << die->getCol();
+//                 }
+//             }
+//         }
+//     }
+//     QGraphicsView::mouseReleaseEvent(event);
+// }
+
+void WaferGraphicsView::wheelEvent(QWheelEvent* event) {
+    const double zoomFactor = 1.1; // 每次缩放的倍率
+    const double minScale = 1;
+    const double maxScale = 10.0;
+
+    if (event->angleDelta().y() > 0) {
+        if (scaleFactor < maxScale) {
+            scale(zoomFactor, zoomFactor);
+            scaleFactor *= zoomFactor;
+        }
+    } else {
+        if (scaleFactor > minScale) {
+            scale(1.0 / zoomFactor, 1.0 / zoomFactor);
+            scaleFactor /= zoomFactor;
+        }
+    }
+
+    event->accept();
+}

+ 29 - 0
CameraMaterialGroupWnd/MaterialWindow/WaferGraphicsView.h

@@ -0,0 +1,29 @@
+#ifndef WAFERGRAPHICSVIEW_H
+#define WAFERGRAPHICSVIEW_H
+
+#include <QGraphicsView>
+#include <QGraphicsScene>
+#include <QGraphicsRectItem>
+#include <QMouseEvent>
+#include "DieItem.h"
+
+class WaferGraphicsView : public QGraphicsView {
+    Q_OBJECT
+
+public:
+    WaferGraphicsView(QGraphicsScene* scene, QWidget* parent = nullptr);
+
+protected:
+    // void mousePressEvent(QMouseEvent* event) override;
+    // void mouseMoveEvent(QMouseEvent* event) override;
+    // void mouseReleaseEvent(QMouseEvent* event) override;
+    void wheelEvent(QWheelEvent* event) override;
+
+private:
+    bool selecting; // 是否正在框选
+    QPointF selectionStart; // 框选起点
+    QGraphicsRectItem* selectionRect; // 框选矩形
+    double scaleFactor; // 当前缩放比例
+};
+
+#endif // WAFERGRAPHICSVIEW_H

+ 14 - 3
ImageWidget.cpp

@@ -1,7 +1,7 @@
 #include "ImageWidget.h"
 #include "ui_ImageWidget.h"
 #include <QPainter>
-
+#include <QDebug>
 ImageWidget::ImageWidget(QWidget *parent) :
     QWidget(parent),
     ui(new Ui::ImageWidget),
@@ -21,7 +21,10 @@ void ImageWidget::setPixmap(const QPixmap& newPixmap) {
     imageOffset = QPoint(0, 0); // 重置图片偏移量为(0, 0)
     update(); // 触发重绘
 }
-
+void ImageWidget::setPixmapAndPoint(const QPixmap& pixmap){
+    this->pixmap = pixmap;
+    update();
+}
 void ImageWidget::paintEvent(QPaintEvent *event) {
     QPainter painter(this);
     if (!pixmap.isNull()) {
@@ -40,6 +43,7 @@ void ImageWidget::mousePressEvent(QMouseEvent *event) {
     if (event->button() == Qt::LeftButton) {
         lastMousePos = event->pos(); // 记录鼠标按下时的位置
         isDragging = true; // 设置正在拖动的标志
+        setCursor(Qt::OpenHandCursor);
     }
 }
 
@@ -55,6 +59,13 @@ void ImageWidget::mouseMoveEvent(QMouseEvent *event) {
 void ImageWidget::mouseReleaseEvent(QMouseEvent *event) {
     if (event->button() == Qt::LeftButton) {
         isDragging = false; // 重置正在拖动的标志
+        setCursor(Qt::ArrowCursor);
     }
 }
-
+void ImageWidget::mouseDoubleClickEvent(QMouseEvent *event){
+    if (event->type() == QEvent::MouseButtonDblClick) {
+        // 恢复原始图像
+        sendDoubleClicksignal();
+    }
+    QWidget::mouseDoubleClickEvent(event);
+}

+ 4 - 2
ImageWidget.h

@@ -18,13 +18,15 @@ public:
     ~ImageWidget();
 
     void setPixmap(const QPixmap& pixmap);
-
+    void setPixmapAndPoint(const QPixmap& pixmap);
+signals:
+    void sendDoubleClicksignal();
 protected:
     void paintEvent(QPaintEvent *event) override;
     void mousePressEvent(QMouseEvent *event) override;
     void mouseMoveEvent(QMouseEvent *event) override;
     void mouseReleaseEvent(QMouseEvent *event) override;
-
+    void mouseDoubleClickEvent(QMouseEvent *event) override;
 private:
     Ui::ImageWidget *ui;
     QPixmap pixmap;

+ 16 - 2
Login.cpp

@@ -10,8 +10,13 @@ Login::Login(QWidget *parent)
     , ui(new Ui::Login)
 {
     ui->setupUi(this);
-
     initForm();
+
+    if(gen_if.getLanguageValue() == 0){
+
+    }else{
+        setChineseMode(this);
+    }
 }
 
 Login::~Login()
@@ -30,7 +35,16 @@ void Login::initForm()
 
     connect(ui->userNameLineEdit, &QLineEdit::textChanged, this, &Login::onUserNameChanged);
 }
-
+void Login::setChineseMode(QMainWindow *Login){
+    Login->setWindowTitle(QCoreApplication::translate("Login", "主界面", nullptr));
+    ui->SinginButton->setText(QCoreApplication::translate("Login", "登录", nullptr));
+    ui->label_logo->setText(QString());
+    ui->label_pass->setText(QString());
+    ui->label_user->setText(QString());
+    ui->ExitButton->setText(QCoreApplication::translate("Login", "退出", nullptr));
+    ui->userNameLineEdit->setPlaceholderText("请输入账号");
+    ui->passLineEdit->setPlaceholderText("请输入密码");
+}
 void Login::onUserNameChanged(const QString &userName) {
     QSettings settings("YourCompany_2", "YourAppName_2");
     settings.setValue("userName", userName);

+ 4 - 2
Login.h

@@ -1,8 +1,9 @@
+#pragma once
 #ifndef LOGIN_H
 #define LOGIN_H
 
 #include <QMainWindow>
-
+#include "gen_interface.h"
 namespace Ui {
 class Login;
 }
@@ -16,7 +17,7 @@ public:
     ~Login();
 
     void initForm();
-
+    void setChineseMode(QMainWindow *Login);
 private slots:
     void on_SinginButton_clicked();
     void onUserNameChanged(const QString &userName);
@@ -25,6 +26,7 @@ private slots:
 
 private:
     Ui::Login *ui;
+    Gen_Interface gen_if;
 };
 
 #endif // LOGIN_H

+ 294 - 8
MainWnd.cpp

@@ -4,13 +4,18 @@
 #include <QMouseEvent>
 #include <qDebug>
 #include "OriginalWnd/OriginalWnd.h"
-
+#include <QDialogButtonBox>
 MainWnd::MainWnd(QWidget *parent)
     : QMainWindow(parent)
     , ui(new Ui::MainWnd)
     ,initialIconSet(false)
 {
     ui->setupUi(this);
+    if(gen_if.getLanguageValue() == 0){
+
+    }else{
+        setChineseMode(this);
+    }
 
 
     // // 初始化 OriginalWnd
@@ -35,12 +40,13 @@ MainWnd::MainWnd(QWidget *parent)
     connect(ui->tabModuleBtn, &QPushButton::clicked,
             this, &MainWnd::on_tabModuleBtn_clicked);
 
-    connect(ui->tabSystemBtn, &QPushButton::clicked,
-            this, &MainWnd::on_tabSystemBtn_clicked);
+    // connect(ui->tabSystemBtn, &QPushButton::clicked,
+    //         this, &MainWnd::on_tabSystemBtn_clicked);
 
     connect(ui->tabProgramBtn, &QPushButton::clicked,
             this, &MainWnd::on_tabProgramBtn_clicked);
-
+    connect(this,&MainWnd::setLanguageSignal,
+            this->m_originalWnd,&OriginalWnd::onHandleLanguageSignal);
     // 设置 OriginalWnd 为当前页面
     ui->stackedWidget_UI->setCurrentWidget(m_originalWnd);
     qDebug() << "OriginalWnd 已设置为 stackedWidget 的当前页面";
@@ -101,8 +107,120 @@ void MainWnd::on_tabDiagnosisBtn_clicked()
 
 void MainWnd::on_tabSystemBtn_clicked()
 {
-    m_originalWnd->switchToSystemConfig();
-    ui->stackedWidget_UI->setCurrentWidget(m_originalWnd);
+    QDialog settingsDialog(this);
+    QVBoxLayout *mainLayout = new QVBoxLayout(&settingsDialog);
+    settingsDialog.setWindowTitle("Settings");
+    // Language Group
+    QLabel *languageLabel = new QLabel("Language:", &settingsDialog);
+    QRadioButton *englishRadio = new QRadioButton("English", &settingsDialog);
+    QRadioButton *chineseRadio = new QRadioButton("Chinese", &settingsDialog);
+
+    QButtonGroup *languageGroup = new QButtonGroup(&settingsDialog);
+    languageGroup->addButton(englishRadio);
+    languageGroup->addButton(chineseRadio);
+
+    QVBoxLayout *languageLayout = new QVBoxLayout;
+    languageLayout->addWidget(languageLabel);
+    languageLayout->addWidget(englishRadio);
+    languageLayout->addWidget(chineseRadio);
+
+    // Theme Group
+    QLabel *themeLabel = new QLabel("Theme:", &settingsDialog);
+    QRadioButton *lightThemeRadio = new QRadioButton("Light", &settingsDialog);
+    QRadioButton *darkThemeRadio = new QRadioButton("Dark", &settingsDialog);
+
+    QButtonGroup *themeGroup = new QButtonGroup(&settingsDialog);
+    themeGroup->addButton(lightThemeRadio);
+    themeGroup->addButton(darkThemeRadio);
+
+    QVBoxLayout *themeLayout = new QVBoxLayout;
+    themeLayout->addWidget(themeLabel);
+    themeLayout->addWidget(lightThemeRadio);
+    themeLayout->addWidget(darkThemeRadio);
+
+    // Dialog Button Box
+    QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, &settingsDialog);
+    connect(buttonBox, &QDialogButtonBox::accepted, &settingsDialog, &QDialog::accept);
+    connect(buttonBox, &QDialogButtonBox::rejected, &settingsDialog, &QDialog::reject);
+
+    mainLayout->addLayout(languageLayout);
+    mainLayout->addLayout(themeLayout);
+    mainLayout->addWidget(buttonBox);
+    int init_language_data,init_theme_data;
+
+    init_language_data = gen_if.getLanguageValue();
+    init_theme_data = gen_if.getThemeValue();
+    if(init_language_data == 0){
+        englishRadio->setChecked(true);
+    }else{
+        chineseRadio->setChecked(true);
+        languageLabel->setText("语言");
+        englishRadio->setText("英语");
+        chineseRadio->setText("中文");
+        themeLabel->setText("主题");
+        lightThemeRadio->setText("浅色");
+        darkThemeRadio->setText("深色");
+        settingsDialog.setWindowTitle("设置");
+
+
+
+    }
+    if(init_theme_data == 0){
+       lightThemeRadio->setChecked(true);
+    }else{
+       darkThemeRadio->setChecked(true);
+    }
+    // Connect signals and slots
+    int current_language_data,current_theme_data;
+    current_language_data = gen_if.getLanguageValue();
+    current_theme_data = gen_if.getThemeValue();
+    connect(languageGroup, QOverload<QAbstractButton *>::of(&QButtonGroup::buttonClicked),
+            [&](QAbstractButton *button) {
+                if (button == englishRadio) {
+                    current_language_data = 0;
+                    qDebug() << "Language set to English";
+                } else if (button == chineseRadio) {
+                    current_language_data = 1;
+                    qDebug() << "Language set to Chinese";
+                }
+            });
+
+    connect(themeGroup, QOverload<QAbstractButton *>::of(&QButtonGroup::buttonClicked),
+            [&](QAbstractButton *button) {
+                if (button == lightThemeRadio) {
+                    current_theme_data = 0;
+                    qDebug() << "Theme set to Light";
+                } else if (button == darkThemeRadio) {
+                    current_theme_data = 1;
+                    qDebug() << "Theme set to Dark";
+                }
+            });
+    int result = settingsDialog.exec();
+    if (result == QDialog::Accepted) {
+        // 处理“OK”按钮点击事件
+        if(init_language_data == current_language_data){
+            //do nothing
+        }else{
+            gen_if.setLanguageValue(current_language_data);
+            if(current_language_data == 0){
+                ui->retranslateUi(this);
+                setLanguageSignal(current_language_data);
+            }else{
+                setChineseMode(this);
+                setLanguageSignal(current_language_data);
+            }
+
+        }
+        if(init_theme_data == current_theme_data){
+            //do nothing
+        }else{
+            gen_if.setThemeValue(current_theme_data);
+        }
+        qDebug() << "Dialog accepted";
+    } else if (result == QDialog::Rejected) {
+        // 处理“Cancel”按钮点击事件
+        // qDebug() << "Dialog rejected";
+    }
 }
 
 
@@ -661,10 +779,178 @@ void MainWnd::onCurrentWidgetChanged() {
     }
 }
 
-
+void MainWnd::setChineseMode(QMainWindow *MainWnd){
+    MainWnd->setWindowTitle(QCoreApplication::translate("MainWnd", "主界面", nullptr));
+    ui->tabHomeBtn->setText(QCoreApplication::translate("MainWnd", "首页", nullptr));
+    ui->label_logo->setText(QString());
+    ui->tabProductionBtn->setText(QCoreApplication::translate("MainWnd", "产品助手", nullptr));
+    ui->tabProgramBtn->setText(QCoreApplication::translate("MainWnd", "进程", nullptr));
+    ui->tabMessageBtn->setText(QCoreApplication::translate("MainWnd", "信息", nullptr));
+    ui->tabModuleBtn->setText(QCoreApplication::translate("MainWnd", "校准", nullptr));
+    ui->tabDispositionBtn->setText(QCoreApplication::translate("MainWnd", "模块配置", nullptr));
+    ui->tabDiagnosisBtn->setText(QCoreApplication::translate("MainWnd", "诊断", nullptr));
+    ui->tabSystemBtn->setText(QCoreApplication::translate("MainWnd", "系统信息", nullptr));
+    ui->tabHelpBtn->setText(QCoreApplication::translate("MainWnd", "帮助", nullptr));
+    ui->pushButton->setText(QCoreApplication::translate("MainWnd", "关闭", nullptr));
+}
 
 void MainWnd::on_pushButton_clicked()
 {
-    qApp->quit();
+    //加确认关闭提示确认窗口
+    // 创建一个消息框
+    QMessageBox msgBox;
+    if(gen_if.getLanguageValue() == 0){
+        msgBox.setWindowTitle("Confirm Close");
+        msgBox.setText("Are you sure you want to close the application?");
+    }else{
+        msgBox.setWindowTitle("确认关闭");
+        msgBox.setText("你确定要关闭程序吗");
+    }
+
+    msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
+    msgBox.setDefaultButton(QMessageBox::No);
+    // 显示消息框并获取用户的选择
+    int ret = msgBox.exec();
+
+    switch (ret) {
+    case QMessageBox::Yes:
+        // 用户点击了确认按钮,执行关闭操作
+        qApp->quit();
+        break;
+    case QMessageBox::No:
+        // 用户点击了取消按钮,不执行任何操作
+        break;
+    default:
+        // 其他情况
+        break;
+    }
+    // qApp->quit();
 }
 
+// QJsonObject MainWnd::getInfofromDb(){
+//     QJsonObject data;
+//     QJsonArray fieldsArray;
+//     QSqlDatabase db = QSqlDatabase::database();
+//     if (!db.isOpen()) {
+//         qWarning() << "数据库未打开";
+//         return data;
+//     }
+
+//     // 查询 systemConfig 表
+//     QSqlQuery queryBond(db);
+//     queryBond.prepare(R"(
+//         SELECT Function, Description,setValue
+//         FROM systemConfig
+//     )");
+//     if (queryBond.exec()) {
+//         while (queryBond.next()) {
+//             QJsonObject field;
+//             field["Function"] = queryBond.value("Function").toString();
+//             field["Description"] = queryBond.value("Description").toString();
+//             field["setValue"] = queryBond.value("setValue").toInt();
+//             fieldsArray.append(field);
+//         }
+
+
+//         // qDebug() << "Fetched fields:" << fieldsArray;
+//     } else {
+//         qWarning() << "查询 systemConfig 失败:" << queryBond.lastError().text();
+//     }
+//     data["systemConfig"]=fieldsArray;
+//     // qDebug() << "Fetched data:" << data;
+//     return data;
+
+// }
+// int MainWnd::getLanguageValue(){
+//     int data;
+//     QJsonArray fieldsArray;
+//     QSqlDatabase db = QSqlDatabase::database();
+//     if (!db.isOpen()) {
+//         qWarning() << "数据库未打开";
+//         return -1;
+//     }
+
+//     // 查询 systemConfig 表
+//     QSqlQuery queryBond(db);
+//     queryBond.prepare(R"(
+//         SELECT Function, Description,setValue
+//         FROM systemConfig
+//     )");
+//     if (queryBond.exec()) {
+//         while (queryBond.next()) {
+//             QJsonObject field;
+
+//             field["Function"] = queryBond.value("Function").toString();
+//             if(field["Function"] == "language"){
+//                 data = queryBond.value("setValue").toInt();
+//                 return data;
+//             }
+//         }
+
+
+//         // qDebug() << "Fetched fields:" << fieldsArray;
+//     } else {
+//         qWarning() << "查询 systemConfig 失败:" << queryBond.lastError().text();
+//     }
+//     return -1;
+
+// }
+// int MainWnd::getThemeValue(){
+//     int data;
+//     QJsonArray fieldsArray;
+//     QSqlDatabase db = QSqlDatabase::database();
+//     if (!db.isOpen()) {
+//         qWarning() << "数据库未打开";
+//         return -1;
+//     }
+
+//     // 查询 systemConfig 表
+//     QSqlQuery queryBond(db);
+//     queryBond.prepare(R"(
+//         SELECT Function, Description,setValue
+//         FROM systemConfig
+//     )");
+//     if (queryBond.exec()) {
+//         while (queryBond.next()) {
+//             QJsonObject field;
+
+//             field["Function"] = queryBond.value("Function").toString();
+//             if(field["Function"] == "theme"){
+//                 data = queryBond.value("setValue").toInt();
+//                 return data;
+//             }
+//         }
+
+
+//         // qDebug() << "Fetched fields:" << fieldsArray;
+//     } else {
+//         qWarning() << "查询 systemConfig 失败:" << queryBond.lastError().text();
+//     }
+//     return -1;
+// }
+// void MainWnd::setLanguageValue(int data){
+//     QSqlDatabase db = QSqlDatabase::database();
+//     if (!db.isOpen()) {
+//         qWarning() << "数据库未打开";
+//     }
+//     QString sql = QString("UPDATE systemConfig SET setValue = '%1' WHERE Function = 'language'").arg(data);
+//     QSqlQuery query;
+//     if (query.exec(sql)) {
+//         qDebug() << "Update successful";
+//     } else {
+//         qDebug() << "Update failed:" << query.lastError().text();
+//     }
+// }
+// void MainWnd::setThemeValue(int data){
+//     QSqlDatabase db = QSqlDatabase::database();
+//     if (!db.isOpen()) {
+//         qWarning() << "数据库未打开";
+//     }
+//     QString sql = QString("UPDATE systemConfig SET setValue = '%1' WHERE Function = 'theme'").arg(data);
+//     QSqlQuery query;
+//     if (query.exec(sql)) {
+//         qDebug() << "Update successful";
+//     } else {
+//         qDebug() << "Update failed:" << query.lastError().text();
+//     }
+// }

+ 19 - 8
MainWnd.h

@@ -1,9 +1,15 @@
-#ifndef MAINWND_H
+#pragma once
+#ifndef MAINWND_H
 #define MAINWND_H
 
 #include <QMainWindow>
 #include <QToolButton>
-
+#include <QJsonObject>
+#include <QtSql>
+#include <QSqlDatabase>
+#include <QSqlQuery>
+#include <QSqlError>
+#include "gen_interface.h"
 QT_BEGIN_NAMESPACE
 namespace Ui {
 class MainWnd;
@@ -12,7 +18,6 @@ QT_END_NAMESPACE
 
 class OriginalWnd;
 
-
 class MainWnd : public QMainWindow
 {
     Q_OBJECT
@@ -20,13 +25,14 @@ class MainWnd : public QMainWindow
 public:
     MainWnd(QWidget *parent = nullptr);
     ~MainWnd();
-
+    void setChineseMode(QMainWindow *MainWnd);
     void initForm();
 
 protected:
     bool eventFilter(QObject *obj,QEvent *event);
     void setTabIcon(QToolButton* tabBtn, const QString& deepIconPath, const QString& lightIconPath);
-
+signals:
+    void setLanguageSignal(const int &data);
 private slots:
     void onCurrentWidgetChanged();
 
@@ -45,14 +51,19 @@ private slots:
     void on_tabDiagnosisBtn_clicked();
 
     void on_tabSystemBtn_clicked();
+    // //从数据库中获取systemconfig表中的信息
+    // QJsonObject getInfofromDb();
+    // int getLanguageValue();
+    // int getThemeValue();
+    // void setLanguageValue(int data);
+    // void setThemeValue(int data);
 
 
 private:
     Ui::MainWnd *ui;
-
-    OriginalWnd *m_originalWnd = nullptr;
+    Gen_Interface gen_if;
+    OriginalWnd *m_originalWnd;
 
     bool initialIconSet;
-
 };
 #endif // MAINWND_H

+ 158 - 9
OriginalWnd/ChartsAndCamerasWnd.cpp

@@ -64,6 +64,7 @@ ChartsAndCamerasWnd::ChartsAndCamerasWnd(QWidget *parent) :
 
 
     initFrom();
+    isShow = true;
 }
 
 ChartsAndCamerasWnd::~ChartsAndCamerasWnd()
@@ -154,6 +155,8 @@ void ChartsAndCamerasWnd::initializeSeriesInfo()
 }
 
 
+
+
 void ChartsAndCamerasWnd::on_CheckBox_clicked()
 {
     // 获取发送信号的复选框
@@ -213,12 +216,17 @@ void ChartsAndCamerasWnd::initFrom() {
 
     initSliders();
     initLineEdits();
-
+    initProgressBar();
+    // 连接 QSlider 的 valueChanged 信号到 QProgressBar 的 setValue 槽
+    connect(ui->RedLightverticalSlider, &QSlider::valueChanged, ui->RedLightprogressBar, &QProgressBar::setValue);
+    connect(ui->BlueLightverticalSlider, &QSlider::valueChanged, ui->BlueLightprogressBar, &QProgressBar::setValue);
+    connect(ui->GreenLightverticalSlider, &QSlider::valueChanged, ui->GreenLightprogressBar, &QProgressBar::setValue);
+    connect(ui->DotLightverticalSlider, &QSlider::valueChanged, ui->DotLightprogressBar, &QProgressBar::setValue);
     connectSliderAndLineEdit(ui->RedLightverticalSlider, ui->RedLightlineEdit);
     connectSliderAndLineEdit(ui->GreenLightverticalSlider, ui->GreenLightlineEdit);
     connectSliderAndLineEdit(ui->BlueLightverticalSlider, ui->BlueLightlineEdit);
     connectSliderAndLineEdit(ui->DotLightverticalSlider, ui->DotLightlineEdit);
-
+    connect(ui->Operatewidget,&ImageWidget::sendDoubleClicksignal,this,&ChartsAndCamerasWnd::handleDoubleClick);
     QWidget *viewport = ui->scrollArea->viewport();
     QWidget *container = new QWidget(viewport);
     QHBoxLayout *layout = new QHBoxLayout(container);
@@ -273,11 +281,14 @@ void ChartsAndCamerasWnd::initFrom() {
         int num = numbers[i];
         CameraImageHandler* manager = new CameraImageHandler(num);
         Group* widget = manager->getGroup();
-
+        connect(widget,&Group::sendSignal,this,&ChartsAndCamerasWnd::showAndHide);
         if (widget != nullptr) {
             layout->addWidget(widget);
             widgets.append(widget);
         }
+        if(manager->getWafer()) {
+            waferMap.insert(num, manager->getWafer());
+        }
 
         delete manager;
     }
@@ -325,6 +336,81 @@ void ChartsAndCamerasWnd::initLineEdits() {
     }
 }
 
+void ChartsAndCamerasWnd::initProgressBar(){
+    QList<int> initialValues = {22, 11, 0, 0};
+    QList<QProgressBar*> progressBar = {
+        ui->RedLightprogressBar,ui->GreenLightprogressBar,
+        ui->BlueLightprogressBar,ui->DotLightprogressBar
+    };
+    for (int i = 0; i < progressBar.size(); ++i) {
+        progressBar[i]->setMinimum(0);
+        progressBar[i]->setMaximum(100);
+        progressBar[i]->setValue(initialValues[i]);
+    }
+    // // ui->RedLightprogressBar->setStyleSheet(
+    // //     "QProgressBar {"
+    // //     "   border: 2px solid grey;"
+    // //     "   border-radius: 5px;"
+    // //     "   text-align: center;"
+    // //     "   color: transparent;" // 隐藏文本
+    // //     "}"
+    // //     "QProgressBar::chunk {"
+    // //     "   background-color: #E4080A;"
+    // //     "   width: 10px;"
+    // //     "   margin: 1px;"
+    // //     "}"
+    // //     );
+    // // ui->GreenLightprogressBar->setStyleSheet(
+    // //     "QProgressBar {"
+    // //     "   border: 2px solid grey;"
+    // //     "   border-radius: 5px;"
+    // //     "   text-align: center;"
+    // //     "   color: transparent;" // 隐藏文本
+    // //     "}"
+    // //     "QProgressBar::chunk {"
+    // //     "   background-color: #28B766;"
+    // //     "   width: 10px;"
+    // //     "   margin: 1px;"
+    // //     "}"
+    // //     );
+
+    // ui->BlueLightprogressBar->setStyleSheet(
+    //     "QProgressBar {"
+    //     "   border: 2px solid grey;"
+    //     "   border-radius: 10px;"
+    //     "   text-align: center;"
+    //     "   color: transparent;"
+    //     "}"
+    //     "QProgressBar::chunk {"
+    //     "   background-color: #00BFFF;"
+    //     "   width: 10px;"
+    //     "   margin: 1px;"
+    //     "}"
+    //     );
+
+
+
+
+
+
+
+
+    // // ui->DotLightprogressBar->setStyleSheet(
+    // //     "QProgressBar {"
+    // //     "   border: 2px solid grey;"
+    // //     "   border-radius: 5px;"
+    // //     "   text-align: center;"
+    // //     "   color: transparent;" // 隐藏文本
+    // //     "}"
+    // //     "QProgressBar::chunk {"
+    // //     "   background-color: #CFCFCF;"
+    // //     "   width: 10px;"
+    // //     "   margin: 1px;"
+    // //     "}"
+    //     // );
+    // qDebug() << "Progress bar style sheet set:" << ui->DotLightprogressBar->styleSheet();
+}
+
 void ChartsAndCamerasWnd::connectSliderAndLineEdit(QSlider* slider, QLineEdit* lineEdit)
 {
     QIntValidator* validator = new QIntValidator(slider->minimum(), slider->maximum(), lineEdit);
@@ -384,7 +470,7 @@ void ChartsAndCamerasWnd::loadGroupSettings(int Id, int Index) {
     } else if (Index == 2) {
         if (materialWndType == 1) {
             clearLayout();
-            WaferWidget();
+            WaferWidget(Id);
         } else if (materialWndType == 2) {
             clearLayout();
             WaffleWidget();
@@ -423,12 +509,12 @@ void ChartsAndCamerasWnd::clearLayout() {
 }
 
 // 圆晶
-void ChartsAndCamerasWnd::WaferWidget() {
+void ChartsAndCamerasWnd::WaferWidget(int Id) {
     QVBoxLayout *layout = new QVBoxLayout(ui->Operatewidget);
-    wafer = new Wafer(1, ui->Operatewidget);
+    waferMap.value(Id)->initFrom(ui->Operatewidget);
 
     layout->setContentsMargins(0, 0, 0, 0);
-    layout->addWidget(wafer);
+    layout->addWidget(waferMap.value(Id)->view);
     ui->Operatewidget->setLayout(layout);
     ui->Operatewidget->setFixedSize(480, 480);
 }
@@ -455,6 +541,13 @@ void ChartsAndCamerasWnd::MaterialBoxWidget() {
     ui->Operatewidget->setFixedSize(480, 480);
 }
 
+void ChartsAndCamerasWnd::handleDoubleClick(){
+    QPixmap scaledImage = currentPixmap.scaled(currentPixmap.width(), currentPixmap.height(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
+    ui->Operatewidget->setPixmap(scaledImage); // 这里传递缩放后的图片
+    scaleFactor = 1.0;
+    ui->label_Percentage->setText("100%");
+}
+
 void ChartsAndCamerasWnd::on_ZoomUpButton_clicked()
 {
     scaleFactor *= 1.1;
@@ -512,7 +605,8 @@ void ChartsAndCamerasWnd::wheelEvent(QWheelEvent *event)
         int newHeight = currentPixmap.height() * scaleFactor;
 
         QPixmap scaledImage = currentPixmap.scaled(newWidth, newHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
-        ui->Operatewidget->setPixmap(scaledImage);
+        // ui->Operatewidget->setPixmap(scaledImage);
+        ui->Operatewidget->setPixmapAndPoint(scaledImage);
 
         double percentage = scaleFactor * 100;
         QString percentageStr = QString::number((int)percentage);
@@ -532,5 +626,60 @@ void ChartsAndCamerasWnd::hideEvent(QHideEvent *event) {
     QMainWindow::hideEvent(event);
 }
 
-
+void ChartsAndCamerasWnd::showAndHide(){
+    if(isShow == true){
+        isShow = false;
+    }else{
+        isShow = true;
+    }
+    QList<QLineEdit*> lineEdits = {
+        ui->RedLightlineEdit, ui->GreenLightlineEdit,
+        ui->BlueLightlineEdit, ui->DotLightlineEdit,
+    };
+    QList<QSlider*> sliders = {
+        ui->RedLightverticalSlider, ui->GreenLightverticalSlider,
+        ui->BlueLightverticalSlider, ui->DotLightverticalSlider
+    };
+    QList<QProgressBar*> progressBar = {
+        ui->RedLightprogressBar,ui->GreenLightprogressBar,
+        ui->BlueLightprogressBar,ui->DotLightprogressBar
+    };
+    if(isShow == true){
+        for (QLineEdit* lineEdit : lineEdits) {
+            lineEdit->show();
+        }
+        for (int i = 0; i < sliders.size(); ++i) {
+            sliders[i]->show();
+        }
+        for (int i = 0; i < progressBar.size(); ++i) {
+            progressBar[i]->show();
+        }
+        ui->BlueLight->show();
+        ui->RedLight->show();
+        ui->DotLight->show();
+        ui->GreenLight->show();
+        ui->BlueLightlabel->show();
+        ui->RedLightlabel->show();
+        ui->DotLightlabel->show();
+        ui->GreenLightlabel->show();
+    }else{
+        for (QLineEdit* lineEdit : lineEdits) {
+            lineEdit->hide();
+        }
+        for (int i = 0; i < sliders.size(); ++i) {
+            sliders[i]->hide();
+        }
+        for (int i = 0; i < progressBar.size(); ++i) {
+            progressBar[i]->hide();
+        }
+        ui->BlueLight->hide();
+        ui->RedLight->hide();
+        ui->DotLight->hide();
+        ui->GreenLight->hide();
+        ui->BlueLightlabel->hide();
+        ui->RedLightlabel->hide();
+        ui->DotLightlabel->hide();
+        ui->GreenLightlabel->hide();
+    }
+}
 

+ 10 - 3
OriginalWnd/ChartsAndCamerasWnd.h

@@ -34,9 +34,11 @@ public:
     void connectSliderAndLineEdit(QSlider* slider, QLineEdit* lineEdit);
     void initLineEdits();
     void initSliders();
+    void initProgressBar();
+    void showAndHide();
 
 protected:
-    void wheelEvent(QWheelEvent *event);
+    void wheelEvent(QWheelEvent *event) override;
     void loadSettings();
     void checkSettings();
     void loadGroupSettings(int Id, int Index);
@@ -44,10 +46,11 @@ protected:
     void hideEvent(QHideEvent *event) override;
 
     void clearLayout(); // 清除大窗口上当前的布局
-    void WaferWidget(); // 圆晶
+    void WaferWidget(int Id); // 圆晶
     void WaffleWidget(); // 华夫盒
     void MaterialBoxWidget(); // 料盒
-
+public slots: // 确保这里声明了槽函数
+    void handleDoubleClick();
 private slots:
     void on_ZoomUpButton_clicked();
 
@@ -110,6 +113,10 @@ private:
     Wafer *wafer; // 声明Wafer指针
     Waffle *waffle; // 声明Waffle指针
     MaterialBox *materialbox; // 声明materialbox指针
+    bool isShow;
+
+    QMap<int, Wafer*> waferMap;
+
 };
 
 #endif // CHARTSANDCAMERASWND_H

+ 67 - 0
OriginalWnd/ChartsAndCamerasWnd.ui

@@ -576,6 +576,25 @@
        <string/>
       </property>
      </widget>
+     <widget class="QProgressBar" name="RedLightprogressBar">
+      <property name="geometry">
+       <rect>
+        <x>32</x>
+        <y>15</y>
+        <width>18</width>
+        <height>51</height>
+       </rect>
+      </property>
+      <property name="styleSheet">
+       <string notr="true"/>
+      </property>
+      <property name="value">
+       <number>24</number>
+      </property>
+      <property name="orientation">
+       <enum>Qt::Vertical</enum>
+      </property>
+     </widget>
     </widget>
     <widget class="QWidget" name="GreenLight" native="true">
      <property name="geometry">
@@ -625,6 +644,22 @@
        <string/>
       </property>
      </widget>
+     <widget class="QProgressBar" name="GreenLightprogressBar">
+      <property name="geometry">
+       <rect>
+        <x>32</x>
+        <y>15</y>
+        <width>18</width>
+        <height>51</height>
+       </rect>
+      </property>
+      <property name="value">
+       <number>24</number>
+      </property>
+      <property name="orientation">
+       <enum>Qt::Vertical</enum>
+      </property>
+     </widget>
     </widget>
     <widget class="QWidget" name="BlueLight" native="true">
      <property name="geometry">
@@ -674,6 +709,22 @@
        <string/>
       </property>
      </widget>
+     <widget class="QProgressBar" name="BlueLightprogressBar">
+      <property name="geometry">
+       <rect>
+        <x>32</x>
+        <y>15</y>
+        <width>18</width>
+        <height>51</height>
+       </rect>
+      </property>
+      <property name="value">
+       <number>24</number>
+      </property>
+      <property name="orientation">
+       <enum>Qt::Vertical</enum>
+      </property>
+     </widget>
     </widget>
     <widget class="Line" name="line_2">
      <property name="geometry">
@@ -765,6 +816,22 @@
        <string/>
       </property>
      </widget>
+     <widget class="QProgressBar" name="DotLightprogressBar">
+      <property name="geometry">
+       <rect>
+        <x>32</x>
+        <y>15</y>
+        <width>18</width>
+        <height>51</height>
+       </rect>
+      </property>
+      <property name="value">
+       <number>24</number>
+      </property>
+      <property name="orientation">
+       <enum>Qt::Vertical</enum>
+      </property>
+     </widget>
     </widget>
     <zorder>BackGround</zorder>
     <zorder>Operatewidget</zorder>

+ 2743 - 0
OriginalWnd/DbTreeViewManager.cpp

@@ -0,0 +1,2743 @@
+#include "DbTreeViewManager.h"
+#include "OriginalWnd/OriginalWnd.h"
+#include "OriginalWnd/NonInteractiveCheckDelegate.h"
+
+
+// 构造函数
+DbTreeViewManager::DbTreeViewManager(OriginalWnd* originalWnd, QWidget* widget2, QWidget* parent)
+    : QWidget(parent),
+    m_originalWnd(originalWnd),
+    widget2(widget2),
+    treeViewDown(new QTreeView(this)),
+    model(new QStandardItemModel(this)),
+    restoring(false),
+    m_blockItemChanged(false)
+
+{
+    if (!widget2) {
+        // qWarning() << "DbTreeViewManager: widget2 未初始化";
+        return;
+    }
+
+    // 设置模型
+    treeViewDown->setModel(model);
+    treeViewDown->setHeaderHidden(true);
+    treeViewDown->setEditTriggers(QAbstractItemView::NoEditTriggers);
+
+    // 设置树视图的几何位置
+    treeViewDown->setGeometry(16, 106, widget2->width() - 16, widget2->height() - 106);
+
+    // 安装事件过滤器以自定义绘制虚线
+    treeViewDown->viewport()->installEventFilter(this);
+
+    // 创建统一分隔线
+    lineFrame1 = createUnifiedSeparator(widget2, 2);
+    lineFrame1->setGeometry(16, 100, 460, 2);
+
+    // 创建按钮并设置布局
+    setupButton();
+
+    // 创建导航栏
+    navigationWidget = new QWidget(widget2);
+    navigationWidget->setGeometry(15, 15, 300, 74);
+
+    // 连接目录前的复选框信号与槽
+    connect(model, &QStandardItemModel::itemChanged, this, &DbTreeViewManager::onItemChanged);
+
+    // 目录树连接点击信号
+    connect(treeViewDown, &QTreeView::clicked, this, &DbTreeViewManager::onTreeViewClicked);
+
+    // 连接目录 expanded 和 collapsed 信号
+    connect(treeViewDown, &QTreeView::expanded, this, [=](const QModelIndex &index) {
+        QStandardItem *item = model->itemFromIndex(index);
+        if (!item) return;
+
+        QStringList path = buildItemPath(item);
+        expandedPaths.insert(path.join("/"));
+        updateSeparatorLine();
+
+        // 保存展开路径
+        saveExpandedPaths();
+    });
+
+    connect(treeViewDown, &QTreeView::collapsed, this, [=](const QModelIndex &index) {
+        QStandardItem *item = model->itemFromIndex(index);
+        if (!item) return;
+
+        QStringList path = buildItemPath(item);
+        expandedPaths.remove(path.join("/"));
+        updateSeparatorLine();
+
+        // 保存展开路径
+        saveExpandedPaths();
+    });
+
+
+
+    // 所有展开操作完成后更新分隔线
+    QTimer::singleShot(0, this, [=]() {
+        QStandardItem *rootItem = model->invisibleRootItem();
+        QStandardItem *thirdItem = findFirstThirdLevelItemDFS(rootItem);
+        if (thirdItem) {
+            QJsonObject thirdLevelObj = thirdItem->data(Qt::UserRole + 2).toJsonObject();
+            if (thirdLevelObj.contains("IsThirdLevel") && thirdLevelObj["IsThirdLevel"].toBool()) {
+                loadButtonConfigForThirdLevel(thirdLevelObj);
+            }
+        }
+    });
+
+    // 应用自定义只读复选框委托
+    treeViewDown->setItemDelegate(new NonInteractiveCheckDelegate(treeViewDown));
+    menuArray[0] = {2, false,-1};
+    menuArray[1] = {5, false,-1};
+    menuArray[2] = {3, false,-1};
+    menuArray[3] = {4, false,-1};
+    menuArray[4] = {6, false,-1};
+    currentMenuId = -1;
+
+}
+
+DbTreeViewManager::~DbTreeViewManager()
+{
+}
+
+
+
+
+// 创建横线样式
+QFrame* DbTreeViewManager::createUnifiedSeparator(QWidget *parent, int height)
+{
+    QFrame *separator = new QFrame(parent);
+    separator->setFrameShape(QFrame::NoFrame); // 移除默认框架
+    separator->setFixedHeight(height);         // 设置固定高度
+    separator->setStyleSheet("background-color: #C7CAEB;");
+    separator->hide();      // 初始化为隐藏
+    return separator;
+}
+
+// 目录树样式
+void DbTreeViewManager::applyCustomStyles() {
+    treeViewDown->setStyleSheet(R"(
+        /* 设置分支图标 */
+        QTreeView::branch:closed:has-children {
+            border-image: none;
+            image: url(:/images/home_add.png);
+        }
+        QTreeView::branch:open:has-children {
+            border-image: none;
+            image: url(:/images/home_minus.png);
+        }
+
+        /* 设置多选框 */
+        QTreeView::indicator:unchecked {
+            image: url(:/images/home_NotSelecte.png);
+        }
+        QTreeView::indicator:checked {
+            image: url(:/images/home_selected.png);
+        }
+
+        /* 背景透明,行间距 */
+        QTreeView {
+            background: transparent;
+            border: none;
+        }
+
+        /* 设置项目选中的背景色 */
+        QTreeView::item:selected {
+            background-color: #A9B4FF;
+        }
+
+        /* 设置项目的行间距 */
+        QTreeView::item {
+            padding-top: 5px;    /* 上边距 */
+            padding-bottom: 5px; /* 下边距 */
+        }
+    )");
+}
+
+// 检查权限
+bool DbTreeViewManager::hasPrivilege(const int &UserGrade, const int &userPrivilege)
+{
+    bool hasPriv;
+    // UserGrade 是以逗号分隔的字符串,如 "1,2,3"
+    if(UserGrade==userPrivilege){
+        hasPriv = true;
+    }else{
+        hasPriv = false;
+    }
+    // qDebug() << "Checking privilege. UserGrade:" << UserGrade << "userPrivilege:" << userPrivilege << "result:" << hasPriv;
+    return hasPriv;
+}
+void DbTreeViewManager::updateDb(const QString &TableName, const int &Id,const QString currentValue){
+    QSqlDatabase db = QSqlDatabase::database();
+    if (!db.isOpen()) {
+        qWarning() << "数据库未打开";
+    }
+    QString sql = QString("UPDATE %1 SET currentValue = :newValue WHERE id = :id").arg(TableName);
+    QSqlQuery query;
+    query.prepare(sql);
+    query.bindValue(":newValue", currentValue);
+    query.bindValue(":id", Id);
+    // 执行更新操作
+    if (!query.exec()) {
+        qWarning() << "Failed to update currentValue:" << query.lastError().text();
+    } else {
+        qDebug() << "currentValue updated successfully.";
+    }
+}
+void DbTreeViewManager::initializeTree(int configId, const int &userPrivilege)
+{
+    qDebug() << "Initializing tree with configId:" << configId << "and userPrivilege:" << userPrivilege;
+
+    m_currentConfigId = configId;  // 设置当前配置ID
+    // 先清空历史
+    clearHistory();
+
+    // 保存之前的选中/展开状态
+    m_blockItemChanged = true;
+    restoring = true;
+
+    // 清理当前的分隔线
+    clearAllSeparators();
+
+    // 清空已有模型数据和相关记录
+    model->clear();
+    firstLevelSeparators.clear();
+    expandedPaths.clear();
+
+    // 清理并隐藏三级目录窗口
+    clearThirdLevelMenu();
+
+    // **Home 界面逻辑**
+    if (configId == 1) {
+
+        // 隐藏目录树和分隔线
+        treeViewDown->hide();
+
+        for (auto separator : firstLevelSeparators) {
+            if (separator)
+                separator->hide();
+        }
+        // 隐藏导航栏
+        navigationWidget->hide();
+
+        // 隐藏按钮
+        updateButtonsVisibility(); // 将按钮隐藏
+
+        // 隐藏特定的分隔线 lineFrame1
+        if (lineFrame1) {
+            lineFrame1->hide();
+        }
+
+        // 从 BondHead 和 Buttons 表中加载 DirectoryId = 1 的数据
+        QJsonObject data = fetchThirdLevelData(1, userPrivilege);
+        displayThirdLevelFields(data, true);   // 传递参数表示 Home 界面
+
+        // 把当前页面压到 m_backStack 里
+        PageState st;
+        st.path << "Home";
+        st.isThirdLevel = true;
+        st.directoryId = 1;
+        m_backStack.append(st);
+        if(m_backStack.size() >= 2){
+            buttonLeft->setIcon(QIcon(":/images/home_left.png"));
+        }
+
+    } else {
+        // **其他配置逻辑**
+        // 设置 treeViewDown 的几何位置
+        treeViewDown->setGeometry(16, 106, widget2->width() - 16, widget2->height() - 106);
+        // 显示目录树和分隔线
+        treeViewDown->show();
+        for (auto separator : firstLevelSeparators) {
+            if (separator)
+                separator->show();
+        }
+        // 应用自定义样式
+        applyCustomStyles();
+
+        // 显示导航栏
+        navigationWidget->show();
+
+        // 显示按钮
+        updateButtonsVisibility();
+
+        // 显示特定的分隔线 lineFrame1
+        if (lineFrame1) {
+            lineFrame1->show();
+        }
+
+        // 加载目录数据 并进行权限判断
+        loadDirectories(configId, userPrivilege);
+
+        // 更新分隔线
+        updateSeparatorLine();
+
+        m_blockItemChanged = false;
+
+        restoring = false;
+
+        // qDebug() << "Tree initialization completed.";
+
+        // 恢复展开路径
+        loadExpandedPaths();
+
+        // 恢复复选框状态
+        loadCheckedPaths();
+
+        // 自动选中第一个根目录项并更新导航栏
+        QStandardItem *rootItem = model->invisibleRootItem()->child(0);
+        if (rootItem) {
+            QModelIndex rootIndex = model->indexFromItem(rootItem);
+            treeViewDown->setCurrentIndex(rootIndex);
+            updateNavigationBar(rootIndex);
+
+            // 如果当前根目录是三级目录,则加载其字段内容
+            QVariant dataVar = rootItem->data(Qt::UserRole + 2).toJsonObject();
+            bool isThirdLevel = false;
+            int directoryId = -1;
+            if (dataVar.canConvert<QJsonObject>()) {
+                QJsonObject thirdLevelObj = dataVar.toJsonObject();
+                if (thirdLevelObj.contains("IsThirdLevel") && thirdLevelObj["IsThirdLevel"].toBool()) {
+                    isThirdLevel = true;
+                    if (thirdLevelObj.contains("Id")) {
+                        directoryId = thirdLevelObj["Id"].toInt();
+                    }
+                }
+            }
+            if (isThirdLevel) {
+                if (directoryId == -1) {
+                    // qWarning() << "无效的 DirectoryId,无法加载第三层目录内容。";
+                    return;
+                }
+                //   userPrivilege 同样传递
+                QJsonObject data = fetchThirdLevelData(directoryId, userPrivilege);
+                displayThirdLevelFields(data, false); // 传递参数表示非 Home 界面
+
+
+                // 把当前状态压入 m_backStack
+                PageState st;
+                st.path = buildItemPath(rootItem);
+                st.isThirdLevel = true;
+                st.directoryId = directoryId;
+                m_backStack.append(st);
+                if(m_backStack.size() >= 2){
+
+                    buttonLeft->setIcon(QIcon(":/images/home_left.png"));
+                }
+            }
+        } else {
+            // qWarning() << "树形模型中没有根目录项。";
+        }
+
+        // 自动找第一个三级目录
+        QStandardItem *rootItem1 = model->invisibleRootItem();
+        QStandardItem *firstThirdItem = findFirstThirdLevelItemDFS(rootItem1);
+        if (!firstThirdItem) {
+            // qDebug() << "[initializeTree] No third-level item found, do nothing.";
+            return;
+        }
+
+        //  QStandardItem 里获取它的目录信息
+        QVariant dataVar = firstThirdItem->data(Qt::UserRole + 2);
+        if (!dataVar.canConvert<QJsonObject>()) {
+            // qWarning() << "[initializeTree] firstThirdItem->data 无法转换为 QJsonObject";
+            return;
+        }
+
+        QJsonObject dirObj = dataVar.toJsonObject();
+        if (!dirObj.contains("Id")) {
+            // qWarning() << "[initializeTree] 第一个三级目录无 Id 字段,无法加载";
+            return;
+        }
+        int directoryId = dirObj["Id"].toInt();
+
+        // 数据库BondHead/Buttons
+        QJsonObject data = fetchThirdLevelData(directoryId, userPrivilege);
+        if (!data.contains("buttons")) {
+            // 第三层没有 buttons 字段
+            qWarning() << "[initializeTree] fetchThirdLevelData: no 'buttons', skip";
+            return;
+        }
+
+        //   singleShot  在所有展开操作完成后更新分隔线
+        QTimer::singleShot(0, this, &DbTreeViewManager::updateSeparatorLine);
+
+        //  loadButtonConfigForThirdLevel 显示按钮
+        loadButtonConfigForThirdLevel(data);
+    }
+
+}
+
+
+
+
+
+// 从数据库加载目录  包含权限判断
+void DbTreeViewManager::loadDirectories(int configId, const int &userPrivilege)
+{
+    // qDebug() << "Loading directories for configId:" << configId << "with userPrivilege:" << userPrivilege;
+
+    QSqlDatabase db = QSqlDatabase::database();
+    if (!db.isOpen()) {
+        qWarning() << "数据库未打开";
+        return;
+    }
+
+    QSqlQuery query(db);
+    query.prepare(R"(
+        SELECT Id, Name, ParentId, IsThirdLevel, Separator, UserGrade, Circle
+        FROM Directories
+        WHERE ConfigId = :configId
+    )");
+    query.bindValue(":configId", configId);
+
+    if (!query.exec()) {
+        qWarning() << "查询 Directories 失败:" << query.lastError().text();
+        return;
+    }
+
+    // 以 QJsonObject 保存所有目录
+    QList<QJsonObject> directories;
+    while (query.next()) {
+        QJsonObject obj;
+        int id = query.value("Id").toInt();
+        obj["Id"] = id;
+        obj["Name"] = query.value("Name").toString();
+        obj["ParentId"] = query.value("ParentId").isNull() ? -1 : query.value("ParentId").toInt();
+        obj["IsThirdLevel"] = query.value("IsThirdLevel").toBool();
+        obj["Separator"] = query.value("Separator").toInt();
+        obj["UserGrade"] = query.value("UserGrade").toString();
+        obj["Circle"] = query.value("Circle").toInt();
+        qDebug() << "加载目录:"<< obj["Name"].toString() << " ParentId:" << obj["ParentId"].toInt()<< " Separator:" << obj["Separator"].toInt();
+        qDebug() << " Circle:" << obj["Circle"].toInt();
+
+        // 权限判断:只有当记录的 UserGrade 中包含当前用户权限时才加入
+        bool ok;
+        if (hasPrivilege(obj["UserGrade"].toString().toInt(&ok,16), userPrivilege))
+            directories.append(obj);
+        else
+            qDebug() << "目录跳过(权限不足):" << obj["Name"].toString();
+    }
+
+
+    // qDebug() << "Loaded directories count:" << directories.size();
+
+    //  根据目录列表构建树模型
+    buildTreeFromDirectories(directories);
+}
+
+
+
+void DbTreeViewManager::buildTreeFromDirectories(const QList<QJsonObject> &directories)
+{
+    // 建立 Id->QStandardItem 的映射
+    QMap<int, QStandardItem*> idItemMap;
+    for (const QJsonObject &dir : directories) {
+        QStandardItem *item = new QStandardItem(dir["Name"].toString());
+        item->setData(dir["Id"].toInt(), Qt::UserRole + 1);  // 保存目录Id
+        // 如果是三级目录,将整个 JSON 对象存到 UserRole+2
+        if (dir["IsThirdLevel"].toBool()) {
+            item->setData(dir, Qt::UserRole + 2);
+        } else {
+            item->setData(false, Qt::UserRole + 2); // 标记为非三级目录
+        }
+        item->setCheckable(true);
+        //  复选框状态由程序逻辑设置
+        item->setCheckState(Qt::Unchecked);
+        idItemMap.insert(dir["Id"].toInt(), item);
+    }
+
+    // 建立父子关系
+    for (const QJsonObject &dir : directories) {
+        int parentId = dir["ParentId"].toInt();
+        int currentId = dir["Id"].toInt();
+        QStandardItem *childItem = idItemMap.value(currentId);
+
+        if (parentId == -1) {
+            // 说明这是一级目录
+            model->invisibleRootItem()->appendRow(childItem);
+
+            // 如果一级目录的 "Separator" == 1,则为其创建一条分割线
+            if (dir["Separator"].toInt() == 1) {
+                QFrame *sep = createUnifiedSeparator(widget2, 2);
+                sep->hide();
+                firstLevelSeparators.insert(childItem, sep);
+            }
+
+        } else {
+            // 非一级目录 => 子目录
+            QStandardItem *parentItem = idItemMap.value(parentId);
+            if (parentItem)
+                parentItem->appendRow(childItem);
+            else
+                qWarning() << "无法找到 ParentId:" << parentId << "的父目录项";
+        }
+    }
+}
+
+
+// 查询三级目录下的 BondHead 和 Buttons 数据 均判断权限
+
+QJsonObject DbTreeViewManager::fetchThirdLevelData(int directoryId, const int &userPrivilege)
+{
+    QJsonObject data;
+    QJsonArray fieldsArray;
+    QJsonArray buttonsArray;
+    QString temp;
+    bool allChangeFlag = true; // 默认所有 ChangeFlag 为 true
+
+    QSqlDatabase db = QSqlDatabase::database();
+    if (!db.isOpen()) {
+        qWarning() << "数据库未打开";
+        return data;
+    }
+    // 查询 TableName 表
+    QSqlQuery queryBondtest(db);
+    queryBondtest.prepare(R"(
+        SELECT TableName
+        FROM Directories
+        WHERE Id = :dirId
+    )");
+    queryBondtest.bindValue(":dirId",directoryId);
+    if (queryBondtest.exec()) {
+        while (queryBondtest.next()) {
+            temp = queryBondtest.value("TableName").toString();
+        }
+    }
+    QStringList tableName = temp.split(",");
+    QString currentTableName;
+    for (const QString &item : tableName) {
+        if (item.isEmpty()) {
+            qDebug() << "Encountered an empty string, stopping traversal.";
+            break; // 遇到空字符串时退出循环
+        }else{
+            currentTableName = item;
+            QString sql = QString("SELECT Id, DirectoryId, Describe, Type, Value,CurrentValue,UpLimit,DownLimit,units, Groupld, UserGrade, ChangeFlag FROM %1 WHERE DirectoryId = :dirId").arg(currentTableName);
+            // 查询 BondHead 表
+            QSqlQuery queryBond(db);
+            queryBond.prepare(sql);
+            queryBond.bindValue(":dirId", directoryId);
+            if (queryBond.exec()) {
+                while (queryBond.next()) {
+                    bool ok;
+                    int dbUserGrade = queryBond.value("UserGrade").toString().toInt(&ok, 16);
+                    // 只有当数据库记录的 UserGrade 包含当前用户权限时才加载该字段
+                    if (!hasPrivilege(dbUserGrade, userPrivilege))
+                        continue;
+                    QJsonObject field;
+                    field["Id"] = queryBond.value("Id").toInt();
+                    field["DirectoryId"] = queryBond.value("DirectoryId").toInt();
+                    field["Describe"] = queryBond.value("Describe").toString();
+                    field["Type"] = queryBond.value("Type").toString();
+                    field["Value"] = queryBond.value("Value").toString();
+                    field["CurrentValue"] = queryBond.value("CurrentValue").toString();
+                    field["UpLimit"] = queryBond.value("UpLimit").toString();
+                    field["DownLimit"] = queryBond.value("DownLimit").toString();
+                    field["units"] = queryBond.value("units").toString();
+                    field["Groupld"] = queryBond.value("Groupld").toInt();
+                    field["ChangeFlag"] = queryBond.value("ChangeFlag").toInt();
+                    field["TableName"] = currentTableName;
+                    fieldsArray.append(field);
+
+                    // 如果有任一字段 ChangeFlag 为 0,则 allChangeFlag = false
+                    if (queryBond.value("ChangeFlag").toInt() == 0)
+                        allChangeFlag = false;
+                }
+                // qDebug() << "Fetched fields:" << fieldsArray;
+            } else {
+                qWarning() << "查询 BondHead 失败:" << queryBond.lastError().text();
+            }
+        }
+    }
+    //QString sql = QString("SELECT Id, DirectoryId, Describe, Type, Value,units, Groupld, UserGrade, ChangeFlag FROM %1 WHERE DirectoryId = :dirId").arg(currentTableName);
+    // // 查询 BondHead 表
+    // QSqlQuery queryBond(db);
+    // queryBond.prepare(sql);
+    // queryBond.bindValue(":dirId", directoryId);
+    // if (queryBond.exec()) {
+    //     while (queryBond.next()) {
+    //         bool ok;
+    //         int dbUserGrade = queryBond.value("UserGrade").toString().toInt(&ok, 16);
+    //         // 只有当数据库记录的 UserGrade 包含当前用户权限时才加载该字段
+    //         if (!hasPrivilege(dbUserGrade, userPrivilege))
+    //             continue;
+    //         QJsonObject field;
+    //         field["Id"] = queryBond.value("Id").toInt();
+    //         field["DirectoryId"] = queryBond.value("DirectoryId").toInt();
+    //         field["Describe"] = queryBond.value("Describe").toString();
+    //         field["Type"] = queryBond.value("Type").toString();
+    //         field["Value"] = queryBond.value("Value").toString();
+    //         field["units"] = queryBond.value("units").toString();
+    //         field["Groupld"] = queryBond.value("Groupld").toInt();
+    //         field["ChangeFlag"] = queryBond.value("ChangeFlag").toInt();
+    //         fieldsArray.append(field);
+
+    //         // 如果有任一字段 ChangeFlag 为 0,则 allChangeFlag = false
+    //         if (queryBond.value("ChangeFlag").toInt() == 0)
+    //             allChangeFlag = false;
+    //     }
+    //     // qDebug() << "Fetched fields:" << fieldsArray;
+    // } else {
+    //     qWarning() << "查询 BondHead 失败:" << queryBond.lastError().text();
+    // }
+
+    // 查询 Buttons 表
+    QSqlQuery queryBtn(db);
+    queryBtn.prepare(R"(
+        SELECT ButtonId, Icon, Text, Enabled, UserGrade
+        FROM Buttons
+        WHERE DirectoryId = :dirId
+    )");
+    queryBtn.bindValue(":dirId", directoryId);
+    if (queryBtn.exec()) {
+        while (queryBtn.next()) {
+            bool ok;
+            int btnUserGrade = queryBtn.value("UserGrade").toString().toInt(&ok, 16);
+            if (!hasPrivilege(btnUserGrade, userPrivilege))
+                continue;
+            QJsonObject button;
+            button["id"] = queryBtn.value("ButtonId").toString();
+            button["icon"] = queryBtn.value("Icon").toString();
+            button["text"] = queryBtn.value("Text").toString();
+            button["enabled"] = queryBtn.value("Enabled").toBool();
+            buttonsArray.append(button);
+        }
+        // qDebug() << "Fetched buttons:" << buttonsArray;
+    } else {
+        qWarning() << "查询 Buttons 失败:" << queryBtn.lastError().text();
+    }
+
+    data["fields"] = fieldsArray;
+    data["buttons"] = buttonsArray;
+    data["IsThirdLevel"] = true;
+    data["allChangeFlag"] = allChangeFlag;
+    return data;
+}
+
+// 事件过滤器,用于自定义绘制虚线
+bool DbTreeViewManager::eventFilter(QObject *watched, QEvent *event)
+{
+    // 拦截 Paint 事件
+    if (watched == treeViewDown->viewport() && event->type() == QEvent::Paint)
+    {
+        // 进行默认绘制
+        bool handled = QWidget::eventFilter(watched, event);
+
+        // 使用 QPainter 叠加画“拐角线”
+        QPainter painter(treeViewDown->viewport());
+        if (!painter.isActive()) {
+            qWarning() << "Painter not active";
+            return handled;
+        }
+        painter.save();
+        painter.setPen(QPen(Qt::gray, 1, Qt::DashLine)); // 灰色、1px 宽、虚线
+
+        // 调用递归函数,绘制所有分支
+        paintAllBranches(QModelIndex(), painter);
+        painter.restore();
+        return handled;
+    }
+    // 其余事件交给父类默认处理
+    return QWidget::eventFilter(watched, event);
+}
+
+
+
+
+// 递归绘制所有分支
+void DbTreeViewManager::paintAllBranches(const QModelIndex &parentIndex, QPainter &painter)
+{
+    int rowCount = model->rowCount(parentIndex);
+    for(int i = 0; i < rowCount; ++i)
+    {
+        // 当前子节点
+        QModelIndex childIndex = model->index(i, 0, parentIndex);
+        if (!childIndex.isValid()) continue;
+
+        // 1) 父->子拐角线
+        drawParentChildLine(childIndex, painter);
+
+        // 2) 兄弟延续竖线(如果本节点不是最后一个兄弟,就在拐点列画条向下的线)
+        if (i < rowCount - 1) {
+            drawSiblingLine(childIndex, painter);
+        }
+
+        // 3) 递归处理子节点
+        paintAllBranches(childIndex, painter);
+    }
+}
+
+// 在“父节点 -> 子节点”间画一条“L”型拐角线,调整横向线段的长度
+void DbTreeViewManager::drawParentChildLine(const QModelIndex &childIndex, QPainter &painter)
+{
+    QModelIndex parentIndex = childIndex.parent();
+    if (!parentIndex.isValid()) {
+        // “顶层节点”定义一个固定的起点 (rootX, rootY)
+        int indent = treeViewDown->indentation();
+        int depth = 0;  // 顶层节点深度为0
+        int branchX = (depth + 1) * indent - indent / 2; // 计算 branchX 基于缩进和深度
+
+        // 定义 rootY 为节点中心 Y
+        QRect childRect = treeViewDown->visualRect(childIndex);
+        if (!childRect.isValid())
+            return;
+
+        int rootY = childRect.center().y();
+
+        // 定义横向偏移量
+        const int hOffset = -20;
+
+        // 绘制竖线
+        painter.drawLine(QPoint(branchX, rootY),
+                         QPoint(branchX, childRect.center().y()));
+
+        // 计算新的横线终点
+        int newX = childRect.left() + hOffset;
+
+        // 绘制横线
+        painter.drawLine(QPoint(branchX, childRect.center().y()),
+                         QPoint(newX, childRect.center().y()));
+        return;
+    }
+
+    QRect parentRect = treeViewDown->visualRect(parentIndex);
+    QRect childRect  = treeViewDown->visualRect(childIndex);
+    if (!parentRect.isValid() || !childRect.isValid()) {
+        // 父或子超出可视区域
+        return;
+    }
+
+    int pMidY = parentRect.center().y();
+    int cMidY = childRect.center().y();
+
+    // 计算节点深度
+    int depth = 0;
+    QModelIndex p = parentIndex;
+    while (p.isValid()) {
+        depth++;
+        p = p.parent();
+    }
+
+    int indent = treeViewDown->indentation();
+    int branchX = depth * indent - indent / 2;
+
+    // branchX 不超出视图范围
+    branchX = std::max(branchX, 0);
+
+    // 定义横向偏移量
+    const int hOffset = -15;
+
+    // 绘制竖线
+    painter.drawLine(QPoint(branchX, pMidY), QPoint(branchX, cMidY));
+
+    // 计算新的横线终点
+    int newX = childRect.left() + hOffset;
+
+    // 绘制横线
+    painter.drawLine(QPoint(branchX, cMidY), QPoint(newX, cMidY));
+}
+
+// 节点下面还有兄弟,则在拐点列那里继续往下画竖线
+void DbTreeViewManager::drawSiblingLine(const QModelIndex &childIndex, QPainter &painter)
+{
+    QModelIndex parentIndex = childIndex.parent();
+    if (!parentIndex.isValid()) {
+        return;     // 没有父节点
+    }
+
+    // 下一个兄弟
+    int row       = childIndex.row();
+    int lastRow   = model->rowCount(parentIndex) - 1;
+    if (row >= lastRow) {
+        return; // 说明是最后一个兄弟,不用画延伸线
+    }
+
+    QModelIndex nextSibling = model->index(row + 1, 0, parentIndex);
+    QRect currRect = treeViewDown->visualRect(childIndex);
+    QRect nextRect = treeViewDown->visualRect(nextSibling);
+    if (!currRect.isValid() || !nextRect.isValid()) {
+        return;
+    }
+
+    // 计算节点深度
+    int depth = 0;
+    QModelIndex p = parentIndex;
+    while (p.isValid()) {
+        depth++;
+        p = p.parent();
+    }
+
+    int indent = treeViewDown->indentation();
+    int branchX = depth * indent - indent / 2;
+
+    // 确保 branchX 不超出视图范围
+    branchX = std::max(branchX, 0);
+
+    // 从当前节点底部向下延伸到下一个兄弟节点顶部
+    int startY = currRect.bottom();
+    int endY   = nextRect.top();
+
+    painter.drawLine(QPoint(branchX, startY), QPoint(branchX, endY));
+}
+
+// 递归查找第一个三级目录项
+QStandardItem* DbTreeViewManager::findFirstThirdLevelItemDFS(QStandardItem *parentItem)
+{
+    if (!parentItem) {
+        return nullptr;
+    }
+
+    // 遍历当前 parentItem 的所有子
+    for (int i = 0; i < parentItem->rowCount(); ++i) {
+        QStandardItem *child = parentItem->child(i);
+        if (!child) continue;
+
+        // 检查这个子节点是否是三级目录
+        QVariant data = child->data(Qt::UserRole + 2);
+        if (data.canConvert<QJsonObject>()) {
+            QJsonObject obj = data.toJsonObject();
+            if (obj.contains("IsThirdLevel") && obj["IsThirdLevel"].toBool()) {
+                // 找到第一个 IsThirdLevel = true 的节点就返回
+                return child;
+            }
+        }
+        // 如果不是 IsThirdLevel,继续往子节点里找
+        QStandardItem* deeperFound = findFirstThirdLevelItemDFS(child);
+        if (deeperFound) {
+            return deeperFound;
+        }
+    }
+
+    return nullptr;
+}
+
+
+void DbTreeViewManager::onItemChanged(QStandardItem *item)
+{
+    if (m_blockItemChanged || restoring) {
+        return; // 防止递归和恢复期间触发
+    }
+
+    m_blockItemChanged = true;
+
+    Qt::CheckState state = item->checkState();
+
+    // 更新所有子项的复选框状态
+    for (int i = 0; i < item->rowCount(); ++i) {
+        QStandardItem *child = item->child(i);
+        if (child) {
+            child->setCheckState(state);
+            // 递归更新子项
+            onItemChanged(child);
+        }
+    }
+
+    // 更新所有父项的复选框状态
+    QModelIndex parentIndex = item->index().parent();
+    while (parentIndex.isValid()) {
+        QStandardItem *parentItem = model->itemFromIndex(parentIndex);
+        if (!parentItem) break;
+
+        int checkedCount = 0;
+        int totalCount = parentItem->rowCount();
+        for (int i = 0; i < totalCount; ++i) {
+            QStandardItem *child = parentItem->child(i);
+            if (child && child->checkState() == Qt::Checked) {
+                checkedCount++;
+            }
+        }
+
+        if (checkedCount == totalCount) {
+            parentItem->setCheckState(Qt::Checked);
+        }
+        else {
+            parentItem->setCheckState(Qt::Unchecked);
+        }
+
+        parentIndex = parentIndex.parent();
+    }
+
+    m_blockItemChanged = false;
+
+    // 记录复选框状态
+    saveCheckedPaths();
+}
+
+
+
+// 初始化和设置按钮
+void DbTreeViewManager::setupButton()
+{
+    // 创建按钮并设置属性
+    auto createButton = [&](QPushButton*& button, const QString& iconPath, const QRect& geometry) {
+        button = new QPushButton(this);
+        button->setIcon(QIcon(iconPath));
+        button->setGeometry(geometry);
+        button->setStyleSheet(R"(
+            QPushButton {
+                position: absolute;
+                border-radius: 6px;
+                opacity: 1;
+                background: #FFFFFF;
+                border: 1px solid #BABBDC;
+            }
+            QPushButton:hover {
+                background-color: #A9B4FF; /* 鼠标悬停效果 */
+            }
+        )");
+        button->show();
+    };
+
+    // 根据原始代码调整按钮的位置和大小
+    createButton(ButtonBack, ":/images/home_openFile.png", QRect(328, 6, 76, 30));
+    createButton(buttonUp, ":/images/home_up.png", QRect(408, 6, 36, 30));
+    createButton(buttonDown, ":/images/home_down.png", QRect(408, 40, 36, 30));
+    createButton(buttonLeft, ":/images/home_left_hide.png", QRect(328, 40, 36, 30));
+    createButton(buttonRight, ":/images/home_right.png", QRect(368, 40, 36, 30));
+
+    // 连接按钮的点击信号到相应的槽函数
+    connect(ButtonBack, &QPushButton::clicked, this, &DbTreeViewManager::onButtonBackClicked);
+    connect(buttonUp, &QPushButton::clicked, this, &DbTreeViewManager::onButtonUpClicked);
+    connect(buttonDown, &QPushButton::clicked, this, &DbTreeViewManager::onButtonDownClicked);
+    connect(buttonLeft, &QPushButton::clicked, this, &DbTreeViewManager::onButtonLeftClicked);
+    connect(buttonRight, &QPushButton::clicked, this, &DbTreeViewManager::onButtonRightClicked);
+}
+
+
+void DbTreeViewManager::updateButtonsVisibility()
+{
+    if (m_currentConfigId == 1) {
+        // Home 界面,隐藏所有按钮
+        ButtonBack->hide();
+        buttonUp->hide();
+        buttonDown->hide();
+        buttonLeft->hide();
+        buttonRight->hide();
+    }
+    else {
+        // 其他配置,显示所有按钮
+        ButtonBack->show();
+        buttonUp->show();
+        buttonDown->show();
+        buttonLeft->show();
+        buttonRight->show();
+    }
+}
+QStandardItem* DbTreeViewManager::deepCopyItem(const QStandardItem *item){
+    if (!item) {
+        return nullptr;
+    }
+
+    // 创建一个新的 QStandardItem
+    QStandardItem *newItem = new QStandardItem(item->text());
+    newItem->setIcon(item->icon());
+    newItem->setToolTip(item->toolTip());
+    newItem->setEditable(item->isEditable());
+    newItem->setCheckable(item->isCheckable());
+    newItem->setCheckState(item->checkState());
+
+    // 递归复制子项
+    for (int i = 0; i < item->rowCount(); ++i) {
+        QStandardItem *childItem = item->child(i);
+        QStandardItem *newChildItem = deepCopyItem(childItem);
+        newItem->appendRow(newChildItem);
+    }
+
+    return newItem;
+}
+void DbTreeViewManager::loadpage(const int &configId){
+    for(int i=0;i<5;i++){
+        if(configId == menuArray[i].menuId){
+            QJsonObject data = fetchThirdLevelData(menuArray[i].index, 0x1);
+            displayThirdLevelFields(data, false);
+        }
+    }
+}
+
+void DbTreeViewManager::onTreeViewClicked(const QModelIndex &index)
+{
+    QStandardItem *item = model->itemFromIndex(index);
+    if (!item) return;
+    // 是否第三层
+    bool isThird = false;
+    int dirId = -1;
+    QVariant dataVar = item->data(Qt::UserRole + 2);
+    if (dataVar.canConvert<QJsonObject>()) {
+        QJsonObject obj = dataVar.toJsonObject();
+        if (obj.contains("IsThirdLevel") && obj["IsThirdLevel"].toBool()) {
+            isThird = true;
+            if (obj.contains("Id")) {
+                dirId = obj["Id"].toInt();
+            }
+        }
+    }
+
+    updateNavigationBar(index);
+
+    if (isThird) {
+        int userPrivilege = 0x1; // 示例
+        if (dirId < 0) {
+            qWarning() << "无效directoryId";
+            return;
+        }
+        QJsonObject data = fetchThirdLevelData(dirId, userPrivilege);
+        displayThirdLevelFields(data, false);
+        for(int i=0;i<5;i++){
+            if(currentMenuId == menuArray[i].menuId){
+                menuArray[i].isthird = true;
+                menuArray[i].index = dirId;
+            }
+        }
+
+        // 将“新页面”压入后退栈, 并清空前进栈
+        PageState st;
+        st.path = buildItemPath(item);
+        st.isThirdLevel = true;
+        st.directoryId  = dirId;
+
+        m_backStack.append(st);
+        if(m_backStack.size() >= 2){
+            buttonLeft->setIcon(QIcon(":/images/home_left.png"));
+        }
+        m_forwardStack.clear();
+        buttonRight->setIcon(QIcon(":/images/home_right.png"));
+    } else {
+        // 不是第三层,只是选中目录
+        // 清理第三层窗口
+        if (m_thirdLevelFieldWnd) {
+            m_thirdLevelFieldWnd->close();
+            m_thirdLevelFieldWnd->deleteLater();
+            m_thirdLevelFieldWnd = nullptr;
+        }
+
+        // 同样更新历史
+        PageState st;
+        st.path = buildItemPath(item);
+        st.isThirdLevel = false;
+        st.directoryId  = -1;
+
+        m_backStack.append(st);
+        if(m_backStack.size() >= 2){
+            buttonLeft->setIcon(QIcon(":/images/home_left.png"));
+        }
+        m_forwardStack.clear();
+        buttonRight->setIcon(QIcon(":/images/home_right.png"));
+    }
+}
+
+void DbTreeViewManager::onTreeViewClicked_updown(const QModelIndex &index){
+    QStandardItem *item = model->itemFromIndex(index);
+    if (!item) return;
+    // 是否第三层
+    bool isThird = false;
+    int dirId = -1;
+    QVariant dataVar = item->data(Qt::UserRole + 2);
+    if (dataVar.canConvert<QJsonObject>()) {
+        QJsonObject obj = dataVar.toJsonObject();
+        if (obj.contains("IsThirdLevel") && obj["IsThirdLevel"].toBool()) {
+            isThird = true;
+            if (obj.contains("Id")) {
+                dirId = obj["Id"].toInt();
+            }
+        }
+    }
+
+    updateNavigationBar(index);
+
+    if (isThird) {
+        int userPrivilege = 0x1; // 示例
+        if (dirId < 0) {
+            qWarning() << "无效directoryId";
+            return;
+        }
+        QJsonObject data = fetchThirdLevelData(dirId, userPrivilege);
+        displayThirdLevelFields(data, false);
+
+        // 将“新页面”压入后退栈, 并清空前进栈
+        PageState st;
+        st.path = buildItemPath(item);
+        st.isThirdLevel = true;
+        st.directoryId  = dirId;
+
+        m_backStack.append(st);
+        if(m_backStack.size() >= 2){
+            buttonLeft->setIcon(QIcon(":/images/home_left.png"));
+        }
+        m_forwardStack.clear();
+        buttonRight->setIcon(QIcon(":/images/home_right.png"));
+    } else {
+        // 不是第三层,只是选中目录
+        // 清理第三层窗口
+        if (m_thirdLevelFieldWnd) {
+            m_thirdLevelFieldWnd->close();
+            m_thirdLevelFieldWnd->deleteLater();
+            m_thirdLevelFieldWnd = nullptr;
+        }
+
+        // 同样更新历史
+        PageState st;
+        st.path = buildItemPath(item);
+        st.isThirdLevel = false;
+        st.directoryId  = -1;
+
+        m_backStack.append(st);
+        if(m_backStack.size() >= 2){
+            buttonLeft->setIcon(QIcon(":/images/home_left.png"));
+        }
+        m_forwardStack.clear();
+        buttonRight->setIcon(QIcon(":/images/home_right.png"));
+    }
+}
+
+
+
+void DbTreeViewManager::updateNavigationBar(const QModelIndex &index)
+{
+    QStandardItem *item = model->itemFromIndex(index);
+    if (!item) {
+        qWarning() << "导航栏更新失败:未找到对应项";
+        return;
+    }
+
+    // 清理现有布局
+    if (navigationWidget->layout()) {
+        QLayoutItem *child;
+        while ((child = navigationWidget->layout()->takeAt(0)) != nullptr) {
+            if (child->widget()) {
+                child->widget()->deleteLater();
+            }
+            delete child;
+        }
+        delete navigationWidget->layout();
+    }
+
+    // 构建路径列表,从当前项回溯到根节点
+    QList<QStandardItem *> path;
+    QStandardItem *temp = item;
+    while (temp) {
+        path.prepend(temp);     // 从根节点开始
+        temp = temp->parent();
+    }
+
+    QVBoxLayout *newLayout = new QVBoxLayout; // 创建新的导航栏布局
+    newLayout->setContentsMargins(0, 0, 3, 3);
+    newLayout->setSpacing(0);
+
+    // 确保显示三行
+    for (int i = 0; i < 3; ++i) {
+        QLabel *label = new QLabel;
+
+        if (i < path.size()) {
+            QString text = path[i]->text();
+            if (i == 1) text = "    " + text;      // 二级目录缩进
+            if (i == 2) text = "        " + text; // 三级目录缩进
+            label->setText(text);
+        } else {
+            label->setText(""); // 填充空白行
+        }
+
+        QFont font = label->font();     // 设置字体和样式
+        font.setPointSize(14);
+        font.setFamily("思源黑体");
+        font.setBold(true);         // 设置文字为粗体
+        font.setLetterSpacing(QFont::PercentageSpacing,105);    // 设置字间距100%为默认
+        label->setFont(font);
+        label->setFixedHeight(navigationWidget->height() / 3);
+
+        newLayout->addWidget(label);
+    }
+
+    // 设置布局并更新导航栏
+    navigationWidget->setLayout(newLayout);
+    navigationWidget->update();
+
+}
+
+
+void DbTreeViewManager::clearAllSeparators()
+{
+    // 遍历 firstLevelSeparators 中所有 QFrame,
+    // 隐藏后调用 deleteLater()
+    for (auto separator : firstLevelSeparators.values()) {
+        if(separator) {
+            separator->hide();
+            separator->deleteLater();
+        }
+    }
+    // 清空映射
+    firstLevelSeparators.clear();
+}
+
+
+
+void DbTreeViewManager::updateSeparatorLine()
+{
+    // 如果目录树被隐藏,就把分割线都藏起来
+    if (!treeViewDown->isVisible()) {
+        for (auto it = firstLevelSeparators.begin(); it != firstLevelSeparators.end(); ++it) {
+            QFrame *sep = it.value();
+            if (sep) sep->hide();
+        }
+        return;
+    }
+
+    // 遍历所有“一级目录”与其分隔线
+    for (auto it = firstLevelSeparators.begin(); it != firstLevelSeparators.end(); ++it) {
+        QStandardItem *firstLevelItem = it.key();
+        QFrame *separator = it.value();
+        if (!firstLevelItem || !separator) continue;
+
+        // 拿到可视区域
+        QModelIndex firstLevelIndex = model->indexFromItem(firstLevelItem);
+        QRect firstLevelRect = treeViewDown->visualRect(firstLevelIndex);
+
+        // 如果这个一级目录滚动到看不见了,就把分割线也藏起来
+        if (!firstLevelRect.isValid()) {
+            separator->hide();
+            continue;
+        }
+
+        // 如果展开并且它有子节点,就找“最后一个可见子项”
+        if (treeViewDown->isExpanded(firstLevelIndex) && firstLevelItem->hasChildren()) {
+            QModelIndex lastVisibleChild = findLastVisibleChild(firstLevelIndex);
+            if (lastVisibleChild.isValid()) {
+                QRect lastChildRect = treeViewDown->visualRect(lastVisibleChild);
+                if (lastChildRect.isValid()) {
+                    // 将分割线放在最后一个子项下面
+                    separator->setGeometry(16,lastChildRect.bottom() + 115,widget2->width() - 40,1);
+                    separator->show();
+                    continue;
+                }
+            }
+        }
+
+        // 如果收起或找不到可见子项,就放在本一级目录下面
+        separator->setGeometry(16,firstLevelRect.bottom() + 115,widget2->width() - 40,1);
+        separator->show();
+    }
+}
+
+
+QModelIndex DbTreeViewManager::findLastVisibleChild(const QModelIndex &parentIndex) {
+    if (!parentIndex.isValid()) return QModelIndex();
+
+    int childCount = model->rowCount(parentIndex);
+    QModelIndex lastVisible;
+
+    for (int i = childCount - 1; i >= 0; --i) {
+        QModelIndex childIndex = model->index(i, 0, parentIndex);
+        if (!treeViewDown->isRowHidden(i, parentIndex)) {
+            if (treeViewDown->isExpanded(childIndex) && model->rowCount(childIndex) > 0) {
+                QModelIndex deeper = findLastVisibleChild(childIndex);
+                if (deeper.isValid()) {
+                    return deeper;
+                }
+            }
+            lastVisible = childIndex;
+            break;
+        }
+    }
+    return lastVisible;
+}
+
+
+
+void DbTreeViewManager::displayThirdLevelFields(const QJsonObject &data, bool isHome)
+{
+    if (data.isEmpty()) {
+        qWarning() << "字段数据为空,无法显示";
+        return;
+    }
+
+    if (!data.contains("IsThirdLevel") || !data["IsThirdLevel"].toBool()) {
+        qWarning() << "不是三级目录,跳过按钮加载";
+        return;
+    }
+
+    bool allChangeFlag = false;
+    if (data.contains("allChangeFlag") && data["allChangeFlag"].isBool()) {
+        allChangeFlag = data["allChangeFlag"].toBool();
+    }
+    else {
+        qWarning() << "数据中缺少 'allChangeFlag' 字段或类型不正确";
+    }
+
+    // 若已有第三层窗口,先关闭并释放
+    if (m_thirdLevelFieldWnd) {
+        m_thirdLevelFieldWnd->close();
+        m_thirdLevelFieldWnd->deleteLater();
+        m_thirdLevelFieldWnd = nullptr;
+    }
+
+    // 获取当前选中的目录项,设置状态
+    QModelIndex currentIndex = treeViewDown->currentIndex();
+    if (currentIndex.isValid()) {
+        QStandardItem* currentItem = model->itemFromIndex(currentIndex);
+        if (currentItem) {
+            currentItem->setCheckState(allChangeFlag ? Qt::Checked : Qt::Unchecked);
+            qDebug() << "设置当前目录项复选框状态为:" << (allChangeFlag ? "Checked" : "Unchecked");
+        }
+    }
+    else {
+        qWarning() << "当前没有选中的目录项";
+    }
+
+    // 隐藏目录树及所有分隔线
+    treeViewDown->hide();
+    for (auto separator : firstLevelSeparators) {
+        if (separator)
+            separator->hide();
+    }
+
+    // 显示按钮
+    loadButtonConfigForThirdLevel(data);
+
+    // 清理之前的控件列表
+    m_fieldWidgets.clear();
+
+    // 创建新的 "字段展示" 窗口,并赋值给 m_thirdLevelFieldWnd
+    m_thirdLevelFieldWnd = new QWidget(widget2);
+    m_thirdLevelFieldWnd->setWindowTitle("字段展示");
+    m_thirdLevelFieldWnd->setStyleSheet("background-color: transparent;");
+    if (isHome) {
+        // Home 界面,填满 widget2
+        m_thirdLevelFieldWnd->setGeometry(0, 0, widget2->width(), widget2->height());
+    }
+    else {
+        // 其他配置界面,设置与 treeViewDown 相同的几何位置
+        m_thirdLevelFieldWnd->setGeometry(treeViewDown->geometry());
+    }
+
+    // 创建滚动区域
+    QScrollArea *scrollArea = new QScrollArea(m_thirdLevelFieldWnd);
+    scrollArea->setWidgetResizable(true);
+    scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+
+    // 创建滚动容器并设置布局
+    QWidget *scrollWidget = new QWidget;
+    scrollWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+    QVBoxLayout *scrollLayout = new QVBoxLayout(scrollWidget);
+    scrollLayout->setSpacing(10);
+    scrollLayout->setContentsMargins(10, 10, 10, 10);
+
+    int previousGroupId = -1;
+    // 遍历字段数组
+    if (data.contains("fields") && data["fields"].isArray()) {
+        QJsonArray fields = data["fields"].toArray();
+        for (const QJsonValue &val : fields) {
+            QJsonObject field = val.toObject();
+            int fieldId = field["Id"].toInt();
+            QString fieldName = field["Describe"].toString();
+            QString fieldType = field["Type"].toString();
+            QString fieldValue = field["Value"].toString();
+            QString fieldCurrentValue = field["CurrentValue"].toString();
+            QString fieldTableName = field["TableName"].toString();
+            QString fieldUpLimit = field["UpLimit"].toString();
+            QString fieldDownLimit = field["DownLimit"].toString();
+            QString fieldUnits = field["units"].toString();
+            int groupId = field["Groupld"].toInt();
+
+            // 如果组变化,插入分隔线
+            if (previousGroupId != -1 && groupId != previousGroupId) {
+                QFrame *separator = createUnifiedSeparator(scrollWidget, 2);
+                QHBoxLayout *separatorLayout = new QHBoxLayout;
+                separatorLayout->setContentsMargins(0, 5, 0, 5);
+                separatorLayout->addWidget(separator);
+                scrollLayout->addLayout(separatorLayout);
+                separator->show();
+            }
+            previousGroupId = groupId;
+
+            // 每个字段一行
+            QHBoxLayout *fieldLayout = new QHBoxLayout;
+            fieldLayout->setSpacing(5);
+
+            QLabel *label = new QLabel(fieldName);
+            label->setAlignment(Qt::AlignVCenter | Qt::AlignLeft);
+            label->setFixedHeight(24);
+            label->setMinimumWidth(120);
+            fieldLayout->addWidget(label);
+            fieldLayout->addStretch(1);
+
+            QWidget *rightWidget = new QWidget;
+            QHBoxLayout *rightLayout = new QHBoxLayout(rightWidget);
+            rightLayout->setContentsMargins(0, 0, 20, 0);
+            rightLayout->setSpacing(5);
+
+            QWidget *createdWidget = nullptr;
+
+            if (fieldType == "input") {
+                // 检查 Value 中是否包含逗号分隔(比如 "请输入内容1,分钟")
+                if (fieldUnits!= "") {
+                    // // 采用逗号分割,trim去除空白
+                    // QStringList parts = fieldValue.split(",", Qt::SkipEmptyParts);
+                    // QString leftText = parts.at(0).trimmed();
+                    // QString rightText = (parts.size() > 1 ? parts.at(1).trimmed() : QString());
+
+                    // 创建 QLineEdit 显示左边文本
+                    QLineEdit *lineEdit = new QLineEdit();
+                    if((fieldUpLimit=="")&&(fieldDownLimit=="")){
+                        lineEdit->setText(fieldCurrentValue);
+                        lineEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+                        lineEdit->setFixedSize(105, 28);
+                        lineEdit->setAlignment(Qt::AlignLeft);
+                        lineEdit->setStyleSheet(R"(
+                        QLineEdit {
+                            background: #FFFFFF;
+                            border: 1px solid #BABBDC;
+                            border-radius: 6px;
+                            padding: 2px 5px;
+                        }
+                    )");
+                    }else{//上下限至少设置了一个值
+                        if(fieldCurrentValue == ""){
+                           lineEdit->setPlaceholderText("请输入数字");
+                        }else{
+                           lineEdit->setText(fieldCurrentValue);
+                        }
+
+
+                        lineEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+                        lineEdit->setFixedSize(105, 28);
+                        lineEdit->setAlignment(Qt::AlignLeft);
+                        lineEdit->setStyleSheet(R"(
+                        QLineEdit {
+                            background: #FFFFFF;
+                            border: 1px solid #BABBDC;
+                            border-radius: 6px;
+                            padding: 2px 5px;
+                        }
+                    )");
+                    }
+
+                    // 创建 QLabel 显示右边文本(比如 "分钟")
+                    QLabel *unitLabel = new QLabel(fieldUnits);
+                    unitLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+                    unitLabel->setFixedHeight(28);
+                    unitLabel->setStyleSheet("QLabel { font-size: 14px; }");
+
+                    // 把 QLineEdit 和 QLabel 水平排列,确保 Qlabel 显示在 QLineEdit 右侧
+                    QHBoxLayout *inputLayout = new QHBoxLayout;
+                    inputLayout->setSpacing(10);
+                    inputLayout->setContentsMargins(0,0,0,0);
+                    inputLayout->addWidget(lineEdit);
+                    inputLayout->addWidget(unitLabel);
+
+                    // 用一个容器部件来装下这个布局
+                    QWidget *inputWidget = new QWidget;
+                    inputWidget->setLayout(inputLayout);
+                    rightLayout->addWidget(inputWidget);
+
+                    // 保存控件指针到 m_fieldWidgets(可选)
+                    m_fieldWidgets.append(lineEdit);
+                    m_fieldWidgets.append(unitLabel);
+                    createdWidget = inputWidget;
+                    // // 连接 textChanged 信号到 lambda 函数
+                    connect(lineEdit, &QLineEdit::textChanged, [this,lineEdit,fieldTableName,fieldId,fieldUpLimit,fieldDownLimit]() {
+                        // qDebug() << "Text changed:" << lineEdit->text();
+                        // qDebug() << "Text changed:" << fieldName;
+                        // qDebug() << "Text changed:" << fieldTableName;
+                        // qDebug() << "Text changed111:" << fieldId;
+                        if((fieldUpLimit!="")&&(fieldDownLimit!="")){
+                            int uplimit = fieldUpLimit.toInt();
+                            int downlimit = fieldDownLimit.toInt();
+                            int inputvalue = (lineEdit->text()).toInt();
+                            if((inputvalue<=uplimit)&&(inputvalue>=downlimit)){
+                                updateDb(fieldTableName,fieldId,lineEdit->text());
+                            }else{
+                                lineEdit->setPlaceholderText("超出设定范围,请重新输入");
+                            }
+                        }else if(fieldDownLimit!=""){
+                            int downlimit = fieldDownLimit.toInt();
+                            int inputvalue = (lineEdit->text()).toInt();
+                            if(inputvalue>=downlimit){
+                                updateDb(fieldTableName,fieldId,lineEdit->text());
+                            }else{
+                              lineEdit->setPlaceholderText("超出设定范围,请重新输入");
+                            }
+                        }else if(fieldUpLimit!=""){
+                            int uplimit = fieldUpLimit.toInt();
+                            int inputvalue = (lineEdit->text()).toInt();
+                            if(inputvalue<=uplimit){
+                                updateDb(fieldTableName,fieldId,lineEdit->text());
+                            }else{
+                                lineEdit->setPlaceholderText("超出设定范围,请重新输入");
+                            }
+                        }else{
+                           updateDb(fieldTableName,fieldId,lineEdit->text());
+                        }
+
+                    });
+                } else {
+                    // 如果不包含逗号,按原有逻辑只创建 QLineEdit
+                    QLineEdit *lineEdit1 = new QLineEdit(fieldCurrentValue);
+                    lineEdit1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+                    lineEdit1->setFixedSize(140, 28);
+                    lineEdit1->setAlignment(Qt::AlignLeft);
+                    lineEdit1->setStyleSheet(R"(
+                        QLineEdit {
+                            background: #FFFFFF;
+                            border: 1px solid #BABBDC;
+                            border-radius: 6px;
+                            padding: 2px 5px;
+                        }
+                    )");
+                    rightLayout->addWidget(lineEdit1);
+                    createdWidget = lineEdit1;
+                    // // 连接 textChanged 信号到 lambda 函数
+                    connect(lineEdit1, &QLineEdit::textChanged, [this,lineEdit1,fieldTableName,fieldId]() {
+                        // qDebug() << "Text changed:" << lineEdit1->text();
+                        // qDebug() << "Text changed:" << fieldName;
+                        updateDb(fieldTableName,fieldId,lineEdit1->text());
+                        // 在这里添加你想要执行的操作
+                    });
+                }
+            }
+            else if (fieldType == "radio") {
+                // 用逗号分隔的选项
+                QStringList optionList = fieldValue.split(QRegExp("[,,]"), Qt::SkipEmptyParts);
+                QHBoxLayout *radioLayout = new QHBoxLayout;
+                radioLayout->setSpacing(5);
+                QButtonGroup *radioGroup = new QButtonGroup(rightWidget);
+                for (const QString &optionText : optionList) {
+                    QString trimmedOpt = optionText.trimmed();
+                    if (trimmedOpt.isEmpty()) continue;
+                    QRadioButton *radioButton = new QRadioButton(trimmedOpt);
+                    radioGroup->addButton(radioButton);
+                    radioLayout->addWidget(radioButton);
+                    m_fieldWidgets.append(radioButton);
+                    if(fieldCurrentValue == trimmedOpt){
+                        radioButton->setChecked(true);
+                    }
+                }
+                // 使用Lambda函数连接 buttonToggled 信号
+                connect(radioGroup, static_cast<void (QButtonGroup::*)(QAbstractButton *, bool)>(&QButtonGroup::buttonToggled),[this,fieldTableName,fieldId](QAbstractButton *button,bool checked) {
+                    if (checked) {
+                        // qDebug() << "Button toggled:" << button->text();
+                        // 在这里添加你想要执行的操作
+                        updateDb(fieldTableName,fieldId,button->text());
+                    }
+                });
+                rightLayout->addLayout(radioLayout);
+            }
+            else if (fieldType == "checkbox") {
+                bool isChecked;
+                if(fieldCurrentValue == ""){
+                    isChecked = (fieldValue == "1");
+                }else{
+                    isChecked = (fieldCurrentValue == "1");
+                }
+
+                QCheckBox *checkBox = new QCheckBox;
+                checkBox->setChecked(isChecked);
+                checkBox->setStyleSheet(R"(
+                    QCheckBox::indicator {
+                        width: 20px;
+                        height: 20px;
+                    }
+                    QCheckBox::indicator:unchecked {
+                        background-color: #FFFFFF;
+                        border: 1px solid #BABBDC;
+                        border-radius: 2px;
+                    }
+                    QCheckBox::indicator:checked {
+                        image: url(:/images/three_Selecte.png);
+                    }
+                    QCheckBox {
+                        spacing: 0px;
+                    }
+                )");
+                rightLayout->addWidget(checkBox);
+                createdWidget = checkBox;
+                connect(checkBox, &QCheckBox::stateChanged, [this,fieldTableName,fieldId](int state) {
+                    if (state == Qt::Checked) {
+                        // qDebug() << "CheckBox is checked"<<fieldId;
+                        updateDb(fieldTableName,fieldId,"1");
+                    } else if (state == Qt::Unchecked) {
+                        // qDebug() << "CheckBox is unchecked"<<fieldId;
+                        // 在这里添加你想要执行的操作
+                        updateDb(fieldTableName,fieldId,"0");
+                    } else if (state == Qt::PartiallyChecked) {
+                        qDebug() << "CheckBox is partially checked";
+                        // 在这里添加你想要执行的操作
+                    }
+                });
+            }
+            else if (fieldType == "dropdown") {
+                QStringList optionList = fieldValue.split(QRegExp("[,,]"), Qt::SkipEmptyParts);
+                QComboBox *comboBox = new QComboBox;
+                comboBox->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+                comboBox->setFixedSize(140, 28);
+                comboBox->setStyleSheet(R"(
+                    QComboBox {
+                        background: #FFFFFF;
+                        border: 1px solid #BABBDC;
+                        border-radius: 6px;
+                        padding: 2px 5px;
+                    }
+                    QComboBox::drop-down {
+                        width: 20px;
+                    }
+                )");
+                // int newIndex = -1;
+                for (const QString &opt : optionList) {
+                    QString trimmedOpt = opt.trimmed();
+                    if (!trimmedOpt.isEmpty())
+                        comboBox->addItem(trimmedOpt);
+                }
+                if(fieldCurrentValue == ""){
+                    comboBox->setCurrentIndex(0);
+                }else{
+                    comboBox->setCurrentIndex(fieldCurrentValue.toInt());
+                }
+                rightLayout->addWidget(comboBox);
+                createdWidget = comboBox;
+                // 使用Lambda函数连接 currentIndexChanged 信号
+                connect(comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), [this,comboBox,fieldTableName,fieldId](int index) {
+                    QString selectedText = comboBox->itemText(index);
+                    QString indexString = QString::number(index);
+                    // qDebug() << "ComboBox index changed to:" << index << "Text:" << selectedText;
+                    updateDb(fieldTableName,fieldId,indexString);
+                    // 在这里添加你想要执行的操作
+                });
+            }
+            else if (fieldType == "time") {
+                QTimeEdit *timeEdit = new QTimeEdit;
+                timeEdit->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+                timeEdit->setFixedSize(120, 28);
+                timeEdit->setStyleSheet(R"(
+                    QTimeEdit {
+                        background: #FFFFFF;
+                        border: 1px solid #BABBDC;
+                        border-radius: 6px;
+                        padding: 2px 5px;
+                    }
+                )");
+                timeEdit->setDisplayFormat("HH:mm:ss");
+                timeEdit->setTime(QTime::fromString(fieldValue, "HH:mm:ss"));
+                rightLayout->addWidget(timeEdit);
+                createdWidget = timeEdit;
+            }
+            else if (fieldType == "switch") {
+                QWidget *switchContainer = new QWidget;
+                QHBoxLayout *switchLayout = new QHBoxLayout(switchContainer);
+                switchLayout->setSpacing(5);
+                switchLayout->setContentsMargins(0, 0, 0, 0);
+                QCheckBox *switchBox = new QCheckBox;
+                switchBox->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+                switchBox->setFixedSize(30, 30);
+                switchBox->setStyleSheet(R"(
+                    QCheckBox::indicator {
+                        width: 30px;
+                        height: 30px;
+                    }
+                    QCheckBox::indicator:unchecked {
+                        background-color: #BABBDC;
+                        border-radius: 6px;
+                    }
+                    QCheckBox::indicator:checked {
+                        background-color: #4CAF50;
+                        border-radius: 6px;
+                    }
+                )");
+                QString switchValue;
+
+                if(fieldCurrentValue==""){
+                    switchValue = fieldValue.toLower();
+                }else{
+                    switchValue = fieldCurrentValue.toLower();
+                }
+                if (switchValue == "on")
+                    switchBox->setChecked(true);
+                else
+                    switchBox->setChecked(false);
+                QLabel *switchLabel = new QLabel(switchBox->isChecked() ? "开" : "关");
+                switchLabel->setAlignment(Qt::AlignVCenter | Qt::AlignLeft);
+                switchLabel->setStyleSheet("font-size: 14px;");
+                connect(switchBox, &QCheckBox::stateChanged, [fieldTableName,fieldId,switchLabel, this](int state){
+                    if (state == Qt::Checked){
+                        switchLabel->setText("开");
+                        updateDb(fieldTableName,fieldId,"on");
+                    }else{
+                        switchLabel->setText("关");
+                        updateDb(fieldTableName,fieldId,"off");
+                    }
+                });
+                switchLayout->addWidget(switchBox);
+                switchLayout->addWidget(switchLabel);
+                rightLayout->addWidget(switchContainer);
+                createdWidget = switchBox;
+            }
+            else if (fieldType == "combined") {
+                // 用逗号分隔
+                QStringList parts = fieldValue.split(QRegExp("[,,]"), Qt::SkipEmptyParts);
+                QString inputText   = (parts.size() >= 1 ? parts.at(0).trimmed() : QString());
+                QString button1Text = (parts.size() >= 2 ? parts.at(1).trimmed() : QStringLiteral("获取"));
+                QString button2Text = (parts.size() >= 3 ? parts.at(2).trimmed() : QStringLiteral("设置"));
+
+                QLineEdit *comboInput = new QLineEdit(inputText);
+                comboInput->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+                comboInput->setFixedHeight(28);
+                comboInput->setStyleSheet(R"(
+                    QLineEdit {
+                        background: #FFFFFF;
+                        border: 1px solid #BABBDC;
+                        border-radius: 5px;
+                        padding: 2px 5px;
+                    }
+                )");
+                m_fieldWidgets.append(comboInput);
+
+                QWidget *combinedWidget = new QWidget;
+                QHBoxLayout *combinedLayout = new QHBoxLayout(combinedWidget);
+                combinedLayout->setSpacing(5);
+                combinedLayout->setContentsMargins(0, 0, 0, 0);
+
+                QPushButton *btnGet = new QPushButton(button1Text, combinedWidget);
+                btnGet->setFixedSize(80, 28);
+                btnGet->setStyleSheet(R"(
+                    QPushButton {
+                        background: #FFFFFF;
+                        border: 1px solid #BABBDC;
+                        border-radius: 5px;
+                    }
+                    QPushButton:hover {
+                        background-color: #F0F0F0;
+                    }
+                )");
+                m_fieldWidgets.append(btnGet);
+
+                QPushButton *btnSet = new QPushButton(button2Text, combinedWidget);
+                btnSet->setFixedSize(80, 28);
+                btnSet->setStyleSheet(R"(
+                    QPushButton {
+                        background: #FFFFFF;
+                        border: 1px solid #BABBDC;
+                        border-radius: 5px;
+                    }
+                    QPushButton:hover {
+                        background-color: #F0F0F0;
+                    }
+                )");
+                m_fieldWidgets.append(btnSet);
+
+                combinedLayout->addWidget(comboInput);
+                combinedLayout->addWidget(btnGet);
+                combinedLayout->addWidget(btnSet);
+                combinedLayout->addStretch();
+                rightLayout->addWidget(combinedWidget);
+            }
+            else {
+                qWarning() << "未知字段类型:" << fieldType;
+            }
+
+            if (createdWidget)
+                m_fieldWidgets.append(createdWidget);
+
+            fieldLayout->addWidget(rightWidget);
+            scrollLayout->addLayout(fieldLayout);
+        }
+    }
+
+    scrollLayout->addStretch();
+
+    scrollArea->setWidget(scrollWidget);
+
+    QVBoxLayout *mainLayout = new QVBoxLayout(m_thirdLevelFieldWnd);
+    mainLayout->setContentsMargins(0, 0, 0, 0);
+    mainLayout->addWidget(scrollArea);
+
+    m_thirdLevelFieldWnd->show();
+}
+
+
+
+
+void DbTreeViewManager::updateParentCheckState(QStandardItem *item)
+{
+    if (!item)
+        return;
+
+    QStandardItem *parentItem = item->parent();
+    if (!parentItem)
+        return;
+
+    bool allChecked = true;
+    bool noneChecked = true;
+
+    for (int i = 0; i < parentItem->rowCount(); ++i) {
+        QStandardItem *child = parentItem->child(i);
+        if (child->checkState() != Qt::Checked) {
+            allChecked = false;
+        }
+        if (child->checkState() == Qt::Checked) {
+            noneChecked = false;
+        }
+    }
+
+    if (allChecked) {
+        parentItem->setCheckState(Qt::Checked);
+    } else {
+        parentItem->setCheckState(Qt::Unchecked);
+    }
+
+    if (noneChecked) {
+        qDebug() << "noneChecked状态为:" << noneChecked;
+
+    }
+
+    // 递归更新上一级
+    updateParentCheckState(parentItem);
+}
+
+
+void DbTreeViewManager::onButtonBackClicked()
+{
+
+    if (m_thirdLevelFieldWnd) {
+        // 当前在第三层目录,返回到上一层目录
+        qDebug() << "当前在第三层目录,准备返回上一层。";
+        for(int i=0;i<5;i++){
+            if(currentMenuId == menuArray[i].menuId){
+                menuArray[i].isthird = false;
+            }
+        }
+        // 关闭并销毁字段展示窗口
+        m_thirdLevelFieldWnd->close();
+        m_thirdLevelFieldWnd->deleteLater();
+        m_thirdLevelFieldWnd = nullptr;
+
+        // 显示目录树和分隔线
+        treeViewDown->show();
+        for (auto separator : firstLevelSeparators) {
+            if (separator)
+                separator->show();
+        }
+
+        // 获取当前导航路径
+        QStringList path;
+        QLayout* layout = navigationWidget->layout();
+        if (!layout) {
+            qWarning() << "导航栏没有布局,无法获取路径。";
+            return;
+        }
+        for (int i = 0; i < layout->count(); ++i) {
+            QLayoutItem* item = layout->itemAt(i);
+            if (item && item->widget()) {
+                QLabel* label = qobject_cast<QLabel*>(item->widget());
+                if (label) {
+                    QString text = label->text().trimmed();
+                    if (!text.isEmpty()) {
+                        path << text;
+                    }
+                }
+            }
+        }
+
+        if (path.isEmpty()) {
+            qWarning() << "导航路径为空,无法返回上一层。";
+            return;
+        }
+
+        // 移除最后一个目录名称以返回上一层
+        path.removeLast();
+
+        if (path.isEmpty()) {
+            qDebug() << "已经在根目录,无法返回。";
+            return;
+        }
+
+        // 根据新的路径查找对应的 QModelIndex
+        QModelIndex parentIndex = findItemByPath(path);
+        if (!parentIndex.isValid()) {
+            qWarning() << "无法找到路径对应的目录项:" << path;
+            return;
+        }
+
+        // 选中父目录项
+        treeViewDown->setCurrentIndex(parentIndex);
+        treeViewDown->scrollTo(parentIndex);
+
+        // 更新导航栏
+        updateNavigationBar(parentIndex);
+
+        // 检查父目录是否为第三层目录
+        QStandardItem* parentItem = model->itemFromIndex(parentIndex);
+        if (!parentItem) {
+            qWarning() << "父目录项无效。";
+            return;
+        }
+
+        QVariant dataVar = parentItem->data(Qt::UserRole + 2);
+        bool isThirdLevel = false;
+        int directoryId = -1;
+
+        if (dataVar.canConvert<QJsonObject>()) {
+            QJsonObject dataObj = dataVar.toJsonObject();
+            if (dataObj.contains("IsThirdLevel") && dataObj["IsThirdLevel"].toBool()) {
+                isThirdLevel = true;
+                if (dataObj.contains("Id")) {
+                    directoryId = dataObj["Id"].toInt();
+                }
+            }
+        }
+
+        if (isThirdLevel) {
+            if (directoryId == -1) {
+                qWarning() << "无效的 DirectoryId,无法加载第三层目录内容。";
+                return;
+            }
+
+            int userPrivilege = 0x1; //  当前用户的权限等级
+            // 获取第三层目录的数据
+            QJsonObject data = fetchThirdLevelData(directoryId, userPrivilege);
+            // 显示字段展示窗口
+            displayThirdLevelFields(data, false); // 传递参数表示非 Home 界面
+        } else {
+            // 父目录不是第三层目录,确保目录树和分隔线可见
+            treeViewDown->show();
+            for (auto separator : firstLevelSeparators) {
+                if (separator)
+                    separator->show();
+            }
+        }
+        return;
+    }
+
+    //  如果不在第三层目录,则在目录树中返回上一层
+    qDebug() << "当前不在第三层目录,尝试在目录树中返回上一层。";
+
+    QModelIndex currentIndex = treeViewDown->currentIndex();
+    if (!currentIndex.isValid()) {
+        qWarning() << "当前没有选中的目录项,无法返回。";
+        return;
+    }
+
+    QStandardItem* currentItem = model->itemFromIndex(currentIndex);
+    if (!currentItem) {
+        qWarning() << "当前选中的目录项无效。";
+        return;
+    }
+
+    QStandardItem* parentItem = currentItem->parent();
+    if (!parentItem) {
+        qDebug() << "当前已经在根目录,无法返回。";
+        return;
+    }
+
+    QModelIndex parentIndex = model->indexFromItem(parentItem);
+    if (!parentIndex.isValid()) {
+        qWarning() << "父目录的 QModelIndex 无效。";
+        return;
+    }
+
+    // 选中父目录项
+    treeViewDown->setCurrentIndex(parentIndex);
+    treeViewDown->scrollTo(parentIndex);
+
+    // 更新导航栏
+    updateNavigationBar(parentIndex);
+
+    // 检查父目录是否为第三层目录
+    QVariant dataVar = parentItem->data(Qt::UserRole + 2);
+    bool isThirdLevel = false;
+    int directoryId = -1;
+
+    if (dataVar.canConvert<QJsonObject>()) {
+        QJsonObject dataObj = dataVar.toJsonObject();
+        if (dataObj.contains("IsThirdLevel") && dataObj["IsThirdLevel"].toBool()) {
+            isThirdLevel = true;
+            if (dataObj.contains("Id")) {
+                directoryId = dataObj["Id"].toInt();
+            }
+        }
+    }
+
+    if (isThirdLevel) {
+        if (directoryId == -1) {
+            qWarning() << "无效的 DirectoryId,无法加载第三层目录内容。";
+            return;
+        }
+
+        int userPrivilege = 0x1; // 根据实际情况获取当前用户的权限等级
+        QJsonObject data = fetchThirdLevelData(directoryId, userPrivilege);
+        displayThirdLevelFields(data, false); // 传递参数表示非 Home 界面
+    }
+}
+
+
+QList<QStandardItem*> DbTreeViewManager::collectAllThirdLevelItems()
+{
+    QList<QStandardItem*> result;
+    // 从根节点开始递归搜集
+    QStandardItem *root = model->invisibleRootItem();
+    if (!root) return result;
+
+    std::function<void(QStandardItem*)> dfsCollectThirdLevel;
+    dfsCollectThirdLevel = [&](QStandardItem* parentItem)
+    {
+        if (!parentItem) return;
+        int rowCount = parentItem->rowCount();
+        for (int i = 0; i < rowCount; ++i) {
+            QStandardItem *child = parentItem->child(i);
+            if (!child) continue;
+
+            // 判断是否是第三层
+            QVariant dataVar = child->data(Qt::UserRole + 2);
+            if (dataVar.canConvert<QJsonObject>()) {
+                QJsonObject obj = dataVar.toJsonObject();
+                if (obj.contains("IsThirdLevel") && obj["IsThirdLevel"].toBool()) {
+                    // 收集这个第三层节点
+                    result.append(child);
+                }
+            }
+            // 即使不是第三层,也要继续往下找子节点
+            dfsCollectThirdLevel(child);
+        }
+    };
+
+    dfsCollectThirdLevel(root);
+    return result;
+}
+
+
+void DbTreeViewManager::onButtonDownClicked()
+{
+    // 1) 收集所有 第三层 节点
+    QList<QStandardItem*> thirdLevelList = collectAllThirdLevelItems();
+    if (thirdLevelList.isEmpty()) {
+        qDebug() << "[onButtonDownClicked] 没有任何三级目录,无法遍历。";
+        return;
+    }
+
+    // 2) 找到  当前选中的节点 在 thirdLevelList 里的索引
+    QModelIndex curIndex = treeViewDown->currentIndex();
+    if (!curIndex.isValid()) {
+        qDebug() << "[onButtonDownClicked] 当前没有选中节点,默认跳到第一个三级目录。";
+        // 如果想默认跳到第一个
+        QStandardItem *firstItem = thirdLevelList.first();
+        QModelIndex idx = model->indexFromItem(firstItem);
+        treeViewDown->setCurrentIndex(idx);
+        // 模拟点击一下
+        onTreeViewClicked_updown(idx);
+        // 保存复选框状态
+        saveCheckedPaths();
+        // 保存展开路径
+        saveExpandedPaths();
+        return;
+    }
+
+    QStandardItem *curItem = model->itemFromIndex(curIndex);
+    if (!curItem) {
+        qWarning() << "[onButtonDownClicked] currentItem 无效。";
+        return;
+    }
+
+    // 若不是三级目录,就先找它最近的父级是不是三级目录,否则当做没找到。
+    int currentPos = -1;
+    {
+        // 在 thirdLevelList 里找到 curItem
+        currentPos = thirdLevelList.indexOf(curItem);
+        if (currentPos < 0) {
+            qDebug() << "[onButtonDownClicked] 当前节点不是三级目录,尝试找父级是不是三级目录…";
+            // 向上找父节点是否在 thirdLevelList 里
+            QStandardItem *temp = curItem->parent();
+            while (temp) {
+                int pos = thirdLevelList.indexOf(temp);
+                if (pos >= 0) {
+                    currentPos = pos;
+                    break;
+                }
+                temp = temp->parent();
+            }
+            if (currentPos < 0) {
+                qDebug() << "还是找不到,说明当前目录不属于任何三级目录,直接跳到第一个";
+                QStandardItem *firstItem = thirdLevelList.first();
+                QModelIndex idx = model->indexFromItem(firstItem);
+                treeViewDown->setCurrentIndex(idx);
+                onTreeViewClicked_updown(idx);
+                // 保存复选框状态
+                saveCheckedPaths();
+                // 保存展开路径
+                saveExpandedPaths();
+                return;
+            }
+        }
+    }
+
+    //  尝试下一个
+    int nextPos = currentPos + 1;
+    if (nextPos >= thirdLevelList.size()) {
+        qDebug() << "[onButtonDownClicked] 已经是最后一个三级目录了,无法再向下。";
+        return;
+    }
+
+    //  跳到下一个
+    QStandardItem *nextItem = thirdLevelList[nextPos];
+    QModelIndex nextIndex = model->indexFromItem(nextItem);
+    treeViewDown->setCurrentIndex(nextIndex);
+    // 相当于模拟点击
+    onTreeViewClicked_updown(nextIndex);
+    // 保存复选框状态
+    saveCheckedPaths();
+    // 保存展开路径
+    saveExpandedPaths();
+}
+
+void DbTreeViewManager::onButtonUpClicked()
+{
+    // 1) 收集所有 第三层 节点
+    QList<QStandardItem*> thirdLevelList = collectAllThirdLevelItems();
+    if (thirdLevelList.isEmpty()) {
+        qDebug() << "[onButtonUpClicked] 没有任何三级目录,无法遍历。";
+        return;
+    }
+
+    // 2) 找到 当前选中的节点
+    QModelIndex curIndex = treeViewDown->currentIndex();
+    if (!curIndex.isValid()) {
+        qDebug() << "[onButtonUpClicked] 当前无选中节点,默认跳到最后一个三级目录。";
+        //  跳到最后一个
+        QStandardItem *lastItem = thirdLevelList.last();
+        QModelIndex idx = model->indexFromItem(lastItem);
+        treeViewDown->setCurrentIndex(idx);
+        // 模拟点击
+        onTreeViewClicked_updown(idx);
+        // 保存复选框状态
+        saveCheckedPaths();
+        // 保存展开路径
+        saveExpandedPaths();
+        return;
+    }
+
+    QStandardItem *curItem = model->itemFromIndex(curIndex);
+    if (!curItem) {
+        qWarning() << "[onButtonUpClicked] currentItem 无效。";
+        return;
+    }
+
+    //  如果当前节点不是三级目录, 向上查找
+    int currentPos = thirdLevelList.indexOf(curItem);
+    if (currentPos < 0) {
+        qDebug() << "[onButtonUpClicked] 当前节点不是三级目录,尝试找父级是不是三级目录。";
+        QStandardItem *temp = curItem->parent();
+        while (temp) {
+            int pos = thirdLevelList.indexOf(temp);
+            if (pos >= 0) {
+                currentPos = pos;
+                break;
+            }
+            temp = temp->parent();
+        }
+        if (currentPos < 0) {
+            qDebug() << "找不到任何三级目录,直接跳到最后一个。";
+            QStandardItem *lastItem = thirdLevelList.last();
+            QModelIndex idx = model->indexFromItem(lastItem);
+            treeViewDown->setCurrentIndex(idx);
+            onTreeViewClicked_updown(idx);
+            // 保存复选框状态
+            saveCheckedPaths();
+            // 保存展开路径
+            saveExpandedPaths();
+            return;
+        }
+    }
+
+    //  尝试上一个
+    int prevPos = currentPos - 1;
+    if (prevPos < 0) {
+        qDebug() << "[onButtonUpClicked] 已经是第一个三级目录了,无法再向上。";
+        return;
+    }
+
+    // 跳到上一个
+    QStandardItem *prevItem = thirdLevelList[prevPos];
+    QModelIndex prevIndex = model->indexFromItem(prevItem);
+    treeViewDown->setCurrentIndex(prevIndex);
+    // 模拟点击
+    onTreeViewClicked_updown(prevIndex);
+    // 保存复选框状态
+    saveCheckedPaths();
+    // 保存展开路径
+    saveExpandedPaths();
+}
+
+
+void DbTreeViewManager::onButtonRightClicked()
+{
+
+    if (m_forwardStack.isEmpty()) {
+        qDebug() << "[Forward] 已经没有可以前进的页面";
+        buttonRight->setIcon(QIcon(":/images/home_right.png"));
+        return;
+    }
+
+    // 1. 弹出 forwardStack 的最后一个
+    PageState st = m_forwardStack.takeLast();
+
+    // 2. 把当前页面 push 到 backStack
+    PageState cur = getCurrentPageState();
+    m_backStack.append(cur);
+    if(m_backStack.size() >= 2){
+        buttonLeft->setIcon(QIcon(":/images/home_left.png"));
+    }
+
+    // 3. 加载 st
+    loadPageState(st, true);
+}
+
+void DbTreeViewManager::onButtonLeftClicked()
+{
+
+    if (m_backStack.size() < 2) {
+        qDebug() << "[Back] 已经无法再后退";
+        buttonLeft->setIcon(QIcon(":/images/home_left_hide.png"));
+        return;
+    }
+
+    // 1. 先把当前页面(相当于 m_backStack 最后一个)弹出,放到 forwardStack
+    PageState cur = m_backStack.takeLast();
+    if(m_backStack.size() >= 2){
+        buttonLeft->setIcon(QIcon(":/images/home_left.png"));
+    }else{
+       buttonLeft->setIcon(QIcon(":/images/home_left_hide.png"));
+    }
+    m_forwardStack.append(cur);
+    buttonRight->setIcon(QIcon(":/images/home_right_show.png"));
+
+    // 2. 拿到新的 m_backStack 末尾(即上一次看的页面)
+    const PageState &prev = m_backStack.last();
+
+    // 3. 加载 prev
+    loadPageState(prev, true  );
+}
+
+
+// 构建节点的完整路径
+QStringList DbTreeViewManager::buildItemPath(QStandardItem *item)
+{
+    QStringList path;
+    QStandardItem *currentItem = item;
+    while (currentItem) {
+        path.prepend(currentItem->text());
+        currentItem = currentItem->parent();
+    }
+    return path;
+}
+
+// 根据路径查找对应的节点
+QModelIndex DbTreeViewManager::findItemByPath(const QStringList &path)
+{
+    if (path.isEmpty()) return QModelIndex();
+
+    QStandardItem *currentItem = model->invisibleRootItem();
+    QModelIndex currentIndex;
+
+    for (const QString &part : path) {
+        bool found = false;
+        for (int i = 0; i < currentItem->rowCount(); ++i) {
+            QStandardItem *child = currentItem->child(i);
+            if (child->text() == part) {
+                currentIndex = model->indexFromItem(child);
+                currentItem = child;
+                found = true;
+                qDebug() << "找到路径部分:" << part;
+                break;
+            }
+        }
+        if (!found) {
+            qWarning() << "路径部分未找到:" << part;
+            return QModelIndex();
+        }
+    }
+    return currentIndex;
+}
+
+
+
+
+void DbTreeViewManager::setCheckedPaths(const QStringList &checkedPathsList)
+{
+    m_blockItemChanged = true;
+
+    for (const QString &pathStr : checkedPathsList) {
+        QStringList path = pathStr.split("/");
+        QModelIndex idx = findItemByPath(path);
+        if (idx.isValid()) {
+            QStandardItem *item = model->itemFromIndex(idx);
+            if (item) {
+                item->setCheckState(Qt::Checked);
+                qDebug() << " Setting item:" << item->text() << "to Checked";
+            }
+        } else {
+            qDebug() << "Path not found:" << pathStr;
+        }
+    }
+
+    m_blockItemChanged = false;
+}
+
+
+
+// 递归收集被选中的路径
+QStringList DbTreeViewManager::collectCheckedPathsRecursive(QStandardItem *item, QStringList path)
+{
+    QStringList checkedList;
+    if (!item) {
+        item = model->invisibleRootItem();
+    }
+
+    for (int i = 0; i < item->rowCount(); ++i) {
+        QStandardItem *child = item->child(i);
+        if (child) {
+            QStringList currentPath = path;
+            currentPath << child->text();
+
+            if (child->checkState() == Qt::Checked) {
+                checkedList << currentPath.join("/");
+            }
+
+            // 递归收集子项
+            checkedList << collectCheckedPathsRecursive(child, currentPath);
+        }
+    }
+
+    return checkedList;
+}
+
+// 收集所有被选中的复选框路径
+QStringList DbTreeViewManager::collectCheckedPaths()
+{
+    return collectCheckedPathsRecursive(model->invisibleRootItem(), QStringList());
+}
+
+
+
+// 更新父项的复选框状态
+void DbTreeViewManager::updateParentItems(QStandardItem *parentItem)
+{
+    if (!parentItem)
+        return;
+
+    int checkedCount = 0;
+    int totalCount = parentItem->rowCount();
+    qDebug() << "Updating child items of:" << parentItem->text();
+
+    for (int i = 0; i < totalCount; ++i)
+    {
+        QStandardItem *child = parentItem->child(i);
+        if (child && child->checkState() == Qt::Checked)
+        {
+            checkedCount++;
+        }
+    }
+
+    if (checkedCount == totalCount)
+    {
+        parentItem->setCheckState(Qt::Checked);
+    }
+    else
+    {
+        parentItem->setCheckState(Qt::Unchecked);
+    }
+
+    // 递归更新上层父项
+    updateParentItems(parentItem->parent());
+}
+
+// 加载并显示三级目录对应按钮配置信息
+void DbTreeViewManager::loadButtonConfigForThirdLevel(const QJsonObject &thirdLevelObj)
+{
+    if (!m_originalWnd) {
+        qWarning() << "OriginalWnd 指针为空,无法加载按钮配置";
+        return;
+    }
+
+    if (!thirdLevelObj.contains("buttons")) {
+        qWarning() << "三级目录配置中不包含 'buttons' 字段";
+        return;
+    }
+
+    QJsonArray buttonsArray = thirdLevelObj.value("buttons").toArray();
+
+    // 获取 widget_left
+    QWidget* widgetLeft = m_originalWnd->getWidgetLeft();
+    if (!widgetLeft) {
+        qWarning() << "无法访问 widget_left";
+        return;
+    }
+
+    // 清空 widget_left 中由 loadButtonConfigForThirdLevel 创建的按钮
+    QList<QPushButton*> existingButtons = widgetLeft->findChildren<QPushButton*>();
+    for (QPushButton* button : existingButtons) {
+        if (button->objectName().startsWith("thirdLevelBtn_")) {   // 仅删除特定按钮
+            button->deleteLater();
+        }
+    }
+
+    // 使用绝对定位创建按钮
+    for (int i = 0; i < buttonsArray.size() && i < 12; ++i) {
+        QJsonObject buttonObj = buttonsArray[i].toObject();
+        QString buttonId = buttonObj.value("id").toString();
+        QString buttonIcon = buttonObj.value("icon").toString();
+        QString buttonText = buttonObj.value("text").toString();
+        bool isEnabled = buttonObj.value("enabled").toBool();
+
+        // 创建按钮
+        QPushButton *button = new QPushButton(widgetLeft);
+        button->setObjectName("thirdLevelBtn_" + buttonId); // 设置带前缀的对象名称
+
+        // 设置按钮的样式,调整图标和文本的位置
+        button->setStyleSheet(R"(
+            QPushButton {
+                position: absolute;
+                border-radius: 6px;
+                opacity: 1;
+                background: #CBD0FF;
+                border: none;
+            }
+            QPushButton:hover {
+                background-color: #A9B4FF; /* 鼠标悬停效果 */
+            }
+        )");
+
+        // 设置按钮的位置和大小
+        int x = 16;
+        int y = 245 + i * (48 + 13); // 第一个按钮 y=245,后续每个按钮间隔13px
+        button->setGeometry(x, y, 158, 48);
+
+        // 设置按钮的可见性,根据 "enabled" 字段显示或隐藏按钮
+        button->setVisible(isEnabled);
+
+        // 创建图标标签
+        QLabel *iconLabel = new QLabel(button);
+        iconLabel->setPixmap(QIcon(buttonIcon).pixmap(16, 16));
+        iconLabel->setGeometry(10, 16, 16, 16); // 图标距离左边10px,顶部16px
+        iconLabel->setFixedSize(16, 16);
+        iconLabel->setStyleSheet("background-color: transparent;");
+        iconLabel->setVisible(isEnabled); // 根据按钮的可见性设置图标的可见性
+
+        // 创建文本标签
+        QLabel *textLabel = new QLabel(buttonText, button);
+        textLabel->setGeometry(34, 0, 90, 48);  // 文本距离左边34px
+        textLabel->setWordWrap(true);  // 允许换行
+        textLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
+        textLabel->setStyleSheet(R"(
+            QLabel {
+                background: transparent;
+                font-family: "思源黑体";
+                font-size: 14px;
+                font-weight: 500;
+                color: #4E51CE;
+            }
+        )");
+
+        textLabel->setVisible(isEnabled); // 根据按钮的可见性设置文本的可见性
+
+        // 创建 F1-F12 标签
+        QString fLabelText = QString("F%1").arg(i + 1);  // F1, F2, ..., F12
+        QLabel *fLabel = new QLabel(fLabelText, button);
+        fLabel->setFixedSize(21, 16);   // 设置大小为21x16
+        fLabel->setAlignment(Qt::AlignCenter);
+        fLabel->setStyleSheet(R"(
+            QLabel {
+                background-color: transparent;
+                color: #2A7ED8;
+                font-size: 12px;
+                font-weight: bold;
+            }
+        )");
+
+        // 设置标签的位置
+        int fX = 134;
+        int fY = 2;
+        fLabel->setGeometry(fX, fY, 14, 16);
+        fLabel->setVisible(isEnabled);   // 根据按钮的可见性设置标签的可见性
+
+        // 将按钮、图标、文本和标签添加到控件列表
+        m_fieldWidgets.append(button);
+        m_fieldWidgets.append(iconLabel);
+        m_fieldWidgets.append(textLabel);
+        m_fieldWidgets.append(fLabel);
+    }
+}
+
+
+// 清理并隐藏三级目录菜单内容
+void DbTreeViewManager::clearThirdLevelMenu()
+{
+    // 遍历所有子控件,找到标题为 "字段展示" 的窗口并关闭
+    foreach (QObject *child, widget2->children()) {
+        QWidget *childWidget = qobject_cast<QWidget*>(child);
+        if (childWidget && childWidget->windowTitle() == "字段展示") {
+            qDebug() << "关闭现有的字段展示窗口";
+            childWidget->close();
+        }
+    }
+
+    // 显示主目录树和分隔线
+    treeViewDown->show();
+    for (auto separator : firstLevelSeparators) {
+        separator->show();
+    }
+}
+
+
+// 保存选中路径
+void DbTreeViewManager::saveCheckedPaths()
+{
+    if (m_currentConfigId == -1) {
+        qWarning() << "当前配置ID无效,无法保存复选框状态。";
+        return;
+    }
+
+    QSettings settings("RunCloudTech", "David");
+    QString configKey = QString::number(m_currentConfigId);
+
+    settings.beginGroup("TreeViewCheckedState");
+
+    // 保存选中路径
+    QString keyChecked = QString("checkedPaths/%1").arg(configKey);
+    QStringList checkedList = collectCheckedPaths();
+    settings.setValue(keyChecked, checkedList);
+
+    settings.endGroup();
+
+    qDebug() << "保存复选框状态路径:" << checkedList;
+}
+
+// 加载选中路径
+void DbTreeViewManager::loadCheckedPaths()
+{
+    if (m_currentConfigId == -1) {
+        qWarning() << "当前配置ID无效,无法加载复选框状态。";
+        return;
+    }
+
+    QSettings settings("RunCloudTech", "David");
+    QString configKey = QString::number(m_currentConfigId);
+
+    settings.beginGroup("TreeViewCheckedState");
+
+    // 读取选中路径
+    QString keyChecked = QString("checkedPaths/%1").arg(configKey);
+    QStringList loadedChecked = settings.value(keyChecked).toStringList();
+
+    settings.endGroup();
+
+    qDebug() << "加载复选框状态路径:" << loadedChecked;
+
+    m_blockItemChanged = true;
+
+    setCheckedPaths(loadedChecked);
+
+    m_blockItemChanged = false;
+
+    // 更新导航栏
+    if (!loadedChecked.isEmpty()) {
+        QString lastPathStr = loadedChecked.last();
+        QStringList lastPath = lastPathStr.split("/");
+        QModelIndex lastIdx  = findItemByPath(lastPath);
+        if (lastIdx.isValid()) {
+            treeViewDown->setCurrentIndex(lastIdx);
+            updateNavigationBar(lastIdx);
+        }
+    } else {
+        // 如果没有加载到任何路径,自动选择第一个目录
+        QStandardItem *rootItem = model->invisibleRootItem();
+        if (rootItem->rowCount() > 0) {
+            QModelIndex firstIndex = model->index(0, 0, QModelIndex());
+            if (firstIndex.isValid()) {
+                treeViewDown->setCurrentIndex(firstIndex);
+                treeViewDown->expand(firstIndex); // 展开第一个目录
+
+                QStandardItem *firstItem = model->itemFromIndex(firstIndex);
+                QVariant data = firstItem->data(Qt::UserRole + 2);
+                if (data.canConvert<QJsonObject>()) {
+                    QJsonObject thirdLevelObj = data.toJsonObject();
+                    if (thirdLevelObj.contains("IsThirdLevel") && thirdLevelObj["IsThirdLevel"].toBool()) {
+                        loadButtonConfigForThirdLevel(thirdLevelObj);
+                    }
+                }
+            }
+        }
+    }
+}
+
+// 保存展开路径
+void DbTreeViewManager::saveExpandedPaths()
+{
+    if (m_currentConfigId == -1) {
+        qWarning() << "当前配置ID无效,无法保存展开路径。";
+        return;
+    }
+
+    QSettings settings("RunCloudTech", "David");
+    QString configKey = QString::number(m_currentConfigId);
+
+    settings.beginGroup("TreeViewExpandedState");
+
+    // 保存展开路径
+    QString keyExpanded = QString("expandedPaths/%1").arg(configKey);
+    QStringList expandedList = QStringList(expandedPaths.begin(), expandedPaths.end());
+    settings.setValue(keyExpanded, expandedList);
+
+    settings.endGroup();
+
+    qDebug() << "保存展开路径:" << expandedList;
+}
+
+// 加载展开路径
+void DbTreeViewManager::loadExpandedPaths()
+{
+    if (m_currentConfigId == -1) {
+        qWarning() << "当前配置ID无效,无法加载展开路径。";
+        return;
+    }
+
+    QSettings settings("RunCloudTech", "David");
+    QString configKey = QString::number(m_currentConfigId);
+
+    settings.beginGroup("TreeViewExpandedState");
+
+    // 读取展开路径
+    QString keyExpanded = QString("expandedPaths/%1").arg(configKey);
+    QStringList loadedExpanded = settings.value(keyExpanded).toStringList();
+
+    settings.endGroup();
+
+    qDebug() << "加载展开路径:" << loadedExpanded;
+
+    m_blockItemChanged = true;
+
+    // 恢复展开路径
+    for (const QString &p : loadedExpanded) {
+        QStringList path = p.split("/");
+        QModelIndex idx = findItemByPath(path);
+        if (idx.isValid()) {
+            treeViewDown->expand(idx);
+            expandedPaths.insert(p);
+            qDebug() << "成功恢复展开路径:" << p;
+        } else {
+            qDebug() << "未找到展开路径部分: " << p;
+        }
+    }
+
+    m_blockItemChanged = false;
+}
+
+
+// 清空历史
+void DbTreeViewManager::clearHistory()
+{
+    m_backStack.clear();
+    m_forwardStack.clear();
+    buttonLeft->setIcon(QIcon(":/images/home_left_hide.png"));
+    buttonRight->setIcon(QIcon(":/images/home_right.png"));
+}
+
+// 获取当前页面的 PageState
+DbTreeViewManager::PageState DbTreeViewManager::getCurrentPageState()
+{
+    PageState st;
+    st.isThirdLevel = false;
+    st.directoryId = -1;
+
+    // 判断是否在第三层窗口中
+    if (m_thirdLevelFieldWnd && m_thirdLevelFieldWnd->isVisible()) {
+        // 如果此时是在第三层界面,则用当前导航栏 or 目录树的 “选中项” 来获取路径
+        QModelIndex curIndex = treeViewDown->currentIndex();
+        if (!curIndex.isValid()) {
+
+            st.path << "未知目录";
+        } else {
+            QStandardItem* item = model->itemFromIndex(curIndex);
+            st.path = buildItemPath(item);
+        }
+
+        // 如果能拿到 DirectoryId,则置为第三层
+        QVariant dataVar = model->itemFromIndex(treeViewDown->currentIndex())->data(Qt::UserRole + 2);
+        if (dataVar.canConvert<QJsonObject>()) {
+            QJsonObject obj = dataVar.toJsonObject();
+            if (obj.contains("IsThirdLevel") && obj["IsThirdLevel"].toBool()) {
+                st.isThirdLevel = true;
+                st.directoryId = obj.value("Id").toInt(-1);
+            }
+        }
+    }
+    else {
+        // 当前是目录树界面,就看 treeView 选中项
+        QModelIndex curIndex = treeViewDown->currentIndex();
+        if (curIndex.isValid()) {
+            QStandardItem* item = model->itemFromIndex(curIndex);
+            st.path = buildItemPath(item);
+
+            // 检查是否第三层
+            QVariant dataVar = item->data(Qt::UserRole + 2);
+            if (dataVar.canConvert<QJsonObject>()) {
+                QJsonObject obj = dataVar.toJsonObject();
+                if (obj.contains("IsThirdLevel") && obj["IsThirdLevel"].toBool()) {
+                    st.isThirdLevel = true;
+                    st.directoryId = obj.value("Id").toInt(-1);
+                }
+            }
+        }
+    }
+    return st;
+}
+
+
+//加载指定的 PageState:相当于“回到该路径”或“跳转到这个第三层”
+
+void DbTreeViewManager::loadPageState(const PageState &st, bool isByHistoryNav)
+{
+    // 先根据 st.path 找到对应的节点
+    QModelIndex idx = findItemByPath(st.path);
+    if (!idx.isValid()) {
+        qWarning() << "[loadPageState] 未找到路径" << st.path;
+        return;
+    }
+
+    // 选中该节点
+    treeViewDown->setCurrentIndex(idx);
+    treeViewDown->scrollTo(idx);
+
+    // 更新导航栏
+    updateNavigationBar(idx);
+
+    // 如果是第三层,就加载对应的数据窗口
+    if (st.isThirdLevel && st.directoryId != -1) {
+        // 如果当前已在一个第三层窗口,先关闭它
+        if (m_thirdLevelFieldWnd) {
+            m_thirdLevelFieldWnd->close();
+            m_thirdLevelFieldWnd->deleteLater();
+            m_thirdLevelFieldWnd = nullptr;
+        }
+
+        int userPrivilege = 0x1;
+        QJsonObject data = fetchThirdLevelData(st.directoryId, userPrivilege);
+        displayThirdLevelFields(data, (m_currentConfigId == 1));
+    } else {
+        // 否则,显示目录树
+        if (m_thirdLevelFieldWnd) {
+            m_thirdLevelFieldWnd->close();
+            m_thirdLevelFieldWnd->deleteLater();
+            m_thirdLevelFieldWnd = nullptr;
+        }
+        treeViewDown->show();
+        for (auto sep : firstLevelSeparators) {
+            if (sep) sep->show();
+        }
+    }
+
+    if (!isByHistoryNav) {
+        m_forwardStack.clear();
+        buttonRight->setIcon(QIcon(":/images/home_right.png"));
+        //   把新状态压入后退栈
+        m_backStack.append(st);
+        if(m_backStack.size() >= 2){
+            buttonLeft->setIcon(QIcon(":/images/home_left.png"));
+        }
+    }
+}

+ 459 - 0
OriginalWnd/DbTreeViewManager.h

@@ -0,0 +1,459 @@
+#ifndef DBTREEVIEWMANAGER_H
+#define DBTREEVIEWMANAGER_H
+
+#include <QWidget>
+#include <QTreeView>
+#include <QJsonObject>
+#include <QStandardItemModel>
+#include <QCheckBox>
+#include <QJsonArray>
+#include <QFile>
+#include <QLineEdit>
+#include <QComboBox>
+#include <QRadioButton>
+#include <QButtonGroup>
+#include <QStyleFactory>
+#include <QEvent>
+#include <QStringList>
+#include <QSettings>
+#include <QSet>
+#include <QVariant>
+#include <QMenu>
+#include <QAction>
+#include <QTimeEdit>
+#include <QCursor>
+#include <QScrollArea>
+#include <QToolButton>
+#include <QtSql>
+#include <QSqlDatabase>
+#include <QSqlQuery>
+#include <QSqlError>
+#include <QMessageBox>
+#include <QPainter>
+#include <QTimer>
+#include <QFileInfo>
+#include <QLabel>
+#include <QHBoxLayout>
+#include <QPushButton>
+#include <QDebug>
+#include <QVBoxLayout>
+#include <QStandardItem>
+#include <QMap>
+#include <QJsonDocument>
+
+class OriginalWnd; ///< 前向声明
+
+/**
+ * @class DbTreeViewManager
+ * @brief 管理树状视图、导航栏、以及与数据库交互的相关逻辑。
+ *
+ * 该类负责从数据库加载目录树 ,并根据用户权限和配置 ID 显示相应的字段与控件。
+ * 同时还支持切换 Home 界面或其他配置界面、隐藏/显示按钮与分隔线等功能。
+ */
+class DbTreeViewManager : public QWidget
+{
+    Q_OBJECT
+
+public:
+
+    /**
+     * @brief 构造函数
+     * @param originalWnd  指向 OriginalWnd 对象的指针
+     * @param widget2      另一个父级或容器部件,用于添加子控件
+     * @param parent       父窗口指针,可为空
+     */
+    explicit DbTreeViewManager(OriginalWnd* originalWnd,
+                               QWidget* widget2, QWidget* parent = nullptr);
+
+    /**
+     * @brief 析构函数,清理资源
+     */
+    ~DbTreeViewManager();
+
+    /**
+     * @brief 初始化目录树,从数据库加载数据
+     * @param configId       配置ID,对应数据库中的 Configurations 表
+     * @param userPrivilege  当前用户的权限等级
+     */
+    void initializeTree(int configId, const int &userPrivilege);
+
+    /**
+     * @brief 清理所有分隔线(内部调用,用于清除旧有的一级目录分隔线等)
+     */
+    void clearAllSeparators();
+
+    /**
+     * @brief 收集所有第三层目录的 QStandardItem
+     * @return 包含第三层目录项的列表
+     */
+    QList<QStandardItem*> collectAllThirdLevelItems();
+
+    /**
+     * @brief 保存所有当前已展开的路径
+     *   对应 expandedPaths 中的路径保存到持久化存储(如 QSettings)
+     */
+    void saveExpandedPaths();
+
+    /**
+     * @brief 加载已展开的路径
+     *   从持久化存储(如 QSettings)中读取展开路径并恢复
+     */
+    void loadExpandedPaths();
+
+    /**
+     * @brief 存储已展开路径的容器
+     *   格式通常为 "Root/Child/Child" 的字符串
+     */
+    QSet<QString> expandedPaths;
+
+signals:
+
+
+private slots:
+
+    /**
+     * @brief 当树中某个项目被点击时触发
+     * @param index 被点击的 QModelIndex
+     */
+    void onTreeViewClicked(const QModelIndex &index);
+
+    /**
+     * @brief 当树中某个项目被点击时触发,专门给up和down按钮使用
+     * @param index 被点击的 QModelIndex
+     */
+    void onTreeViewClicked_updown(const QModelIndex &index);
+    /**
+     * @brief “返回”按钮点击槽函数
+     *   用于在第三层目录与上层目录间进行返回逻辑
+     */
+    void onButtonBackClicked();
+
+    /**
+     * @brief “上”按钮点击槽函数
+     *   用于在所有第三层目录间向上移动
+     */
+    void onButtonUpClicked();
+
+    /**
+     * @brief “下”按钮点击槽函数
+     *   用于在所有第三层目录间向下移动
+     */
+    void onButtonDownClicked();
+
+    /**
+     * @brief “左”按钮点击槽函数
+     *   用于目录层级的向左逻辑(如果有需要)
+     */
+    void onButtonLeftClicked();
+
+    /**
+     * @brief “右”按钮点击槽函数
+     *   用于目录层级的向右逻辑(如果有需要)
+     */
+    void onButtonRightClicked();
+
+    /**
+     * @brief 当树状模型中某个 QStandardItem 的复选框状态发生变化时触发
+     * @param item 发生变化的 QStandardItem
+     */
+    void onItemChanged(QStandardItem *item);
+
+private:
+
+    /**
+     * @brief 指向 OriginalWnd 对象的指针,用于访问或联动其它窗口功能
+     */
+    OriginalWnd* m_originalWnd;
+
+    /**
+     * @brief widget2 外部传入的父级/容器,用于承载子控件
+     */
+    QWidget *widget2;
+
+    /**
+     * @brief 树视图控件
+     */
+    QTreeView *treeViewDown;
+
+    /**
+     * @brief 导航栏 QWidget,用于显示路径信息
+     */
+    QWidget *navigationWidget;
+
+    /**
+     * @brief 树状模型,用于存放目录层级
+     */
+    QStandardItemModel *model;
+
+    /**
+     * @brief 用于存储第三层字段展示窗口的指针(单实例)
+     */
+    QWidget* m_thirdLevelFieldWnd = nullptr;
+
+    /**
+     * @brief 上部的几个操作按钮(例如 “返回”、“上”、“下”、“左”、“右”)
+     */
+    QPushButton *ButtonBack;       ///< 返回按钮
+    QPushButton *buttonUp;        ///< 上按钮
+    QPushButton *buttonDown;      ///< 下按钮
+    QPushButton *buttonLeft;      ///< 左按钮
+    QPushButton *buttonRight;     ///< 右按钮
+
+
+
+
+    //  定义一个结构来记录当前所处页面的信息
+    struct PageState {
+        QStringList path;    // 记录目录的文本路径
+        bool isThirdLevel;   // 是否是第三层目录
+        int  directoryId;    // 第三层目录ID
+    };
+
+
+    //  存储“后退栈”和“前进栈”,
+    QList<PageState> m_backStack;
+    QList<PageState> m_forwardStack;
+
+    //  每次切换控制屏幕时,清空历史
+    void clearHistory();
+
+    //  用于把当前选中的目录或第三层界面封装成 PageState
+    PageState getCurrentPageState();
+
+    // 加载指定 PageState,相当于“跳转”到该状态
+    void loadPageState(const PageState &st, bool isByHistoryNav = false);
+
+
+
+    /**
+     * @brief restoring 标记是否在恢复阶段
+     */
+    bool restoring;
+
+    /**
+     * @brief 存储“一级目录”和相应分隔线的映射,用于更新和控制分隔线位置、可见性等
+     */
+    QMap<QStandardItem*, QFrame*> firstLevelSeparators;
+
+    /**
+     * @brief 标记是否阻止触发 onItemChanged 等复选框变更响应
+     */
+    bool m_blockItemChanged;
+
+    /**
+     * @brief  用于存储第三层界面生成的控件列表,方便统一管理和销毁
+     */
+    QList<QWidget*> m_fieldWidgets;
+
+
+    /**
+     * @brief  当前正在使用的配置ID
+     */
+    int m_currentConfigId = -1;
+
+    /**
+     * @brief  特定分隔线,Home 界面时隐藏,其他界面时显示
+     */
+    QFrame* lineFrame1;
+
+    /**
+     * @brief 从数据库加载指定 configId 下的目录记录,并构建树状结构
+     * @param configId       配置ID
+     * @param userPrivilege  当前用户权限
+     */
+    void loadDirectories(int configId, const int &userPrivilege);
+
+    /**
+     * @brief 在给定父节点内,DFS 查找第一个第三层目录项
+     * @param parentItem 父节点
+     * @return 若找到第三层节点则返回指针,否则返回 nullptr
+     */
+    QStandardItem* findFirstThirdLevelItemDFS(QStandardItem *parentItem);
+
+    /**
+     * @brief 递归更新父级目录的复选框状态
+     * @param item 当前变更的子项
+     */
+    void updateParentItems(QStandardItem *parentItem);
+
+    /**
+     * @brief 由 loadDirectories 获取的目录列表,构建树模型
+     * @param directories 包含目录信息的 QJsonObject 列表
+     */
+    void buildTreeFromDirectories(const QList<QJsonObject> &directories);
+
+    /**
+     * @brief 更新父项的复选框状态(如果所有子项选中则父项也选中,否则取消)
+     * @param item 当前变更的子项
+     */
+    void updateParentCheckState(QStandardItem *item);
+
+    /**
+     * @brief 更新按钮可见性:Home 界面隐藏,其他配置显示
+     */
+    void updateButtonsVisibility();
+
+    /**
+     * @brief 清理并隐藏第三层菜单内容
+     */
+    void clearThirdLevelMenu();
+
+    /**
+     * @brief 由给定的 DirectoryId 查询数据库中的字段信息(BondHead、Buttons)并返回
+     * @param directoryId    目录ID
+     * @param userPrivilege  当前用户权限
+     * @return 包含第三层目录字段和按钮信息的 QJsonObject
+     */
+    QJsonObject fetchThirdLevelData(int directoryId, const int &userPrivilege);
+
+    /**
+     * @brief 自定义事件过滤器,用于在 QTreeView 上绘制虚线等
+     * @param watched 监视的对象
+     * @param event   事件
+     * @return 是否拦截事件
+     */
+    bool eventFilter(QObject *watched, QEvent *event) override;
+
+    /**
+     * @brief 递归绘制所有分支
+     * @param parentIndex 父节点索引
+     * @param painter     QPainter 引用
+     */
+    void paintAllBranches(const QModelIndex &parentIndex, QPainter &painter);
+
+    /**
+     * @brief 绘制父节点到子节点的“拐角线”
+     * @param childIndex  子节点索引
+     * @param painter     QPainter 引用
+     */
+    void drawParentChildLine(const QModelIndex &childIndex, QPainter &painter);
+
+    /**
+     * @brief 兄弟节点之间的竖线连接
+     * @param childIndex  当前节点索引
+     * @param painter     QPainter 引用
+     */
+    void drawSiblingLine(const QModelIndex &childIndex, QPainter &painter);
+
+    /**
+     * @brief 应用自定义样式(例如树的图标、复选框等)
+     */
+    void applyCustomStyles();
+
+    /**
+     * @brief 创建顶部按钮,并绑定槽函数
+     */
+    void setupButton();
+
+    /**
+     * @brief 创建并返回一个统一样式的分隔线 QFrame
+     * @param parent 父对象
+     * @param height 分隔线高度
+     * @return 分隔线 QFrame 指针
+     */
+    QFrame* createUnifiedSeparator(QWidget *parent, int height);
+
+    /**
+     * @brief 更新分隔线位置和可见性(主要针对一级目录和其子项)
+     */
+    void updateSeparatorLine();
+
+    /**
+     * @brief 查找父节点下最后一个可见子项,用于放置分隔线
+     * @param parentIndex 父节点索引
+     * @return 最后一个可见子节点的索引
+     */
+    QModelIndex findLastVisibleChild(const QModelIndex &parentIndex);
+
+    /**
+     * @brief 更新导航栏,显示选中的路径信息
+     * @param index 选中节点的 QModelIndex
+     */
+    void updateNavigationBar(const QModelIndex &index);
+
+    /**
+     * @brief 加载第三层目录按钮配置并在 widget_left 显示
+     * @param thirdLevelObj 包含第三层目录 button 信息的 JSON
+     */
+    void loadButtonConfigForThirdLevel(const QJsonObject &thirdLevelObj);
+
+    /**
+     * @brief 显示第三层目录的字段信息
+     * @param data    第三层目录数据(包含 fields, buttons 等)
+     * @param isHome  是否是 Home 界面,若是则填满 widget2
+     */
+    void displayThirdLevelFields(const QJsonObject &data, bool isHome);
+
+    /**
+     * @brief 保存当前选中的复选框路径到 QSettings
+     */
+    void saveCheckedPaths();
+
+    /**
+     * @brief 从 QSettings 中加载复选框选中路径,并恢复
+     */
+    void loadCheckedPaths();
+
+    /**
+     * @brief 收集所有被选中的复选框路径
+     * @return 被选中的路径列表,每项为 "Root/Child/Child"
+     */
+    QStringList collectCheckedPaths();
+
+    /**
+     * @brief 递归收集选中的路径
+     * @param item 当前节点
+     * @param path 当前路径
+     * @return 收集到的选中路径列表
+     */
+    QStringList collectCheckedPathsRecursive(QStandardItem *item, QStringList path);
+
+    /**
+     * @brief 批量设置选中的复选框
+     * @param checkedPathsList 已选中的路径列表
+     */
+    void setCheckedPaths(const QStringList &checkedPathsList);
+
+    /**
+     * @brief 构建节点的完整路径
+     * @param item 当前 QStandardItem
+     * @return 路径列表,如 ["Root", "Child", "Child2"]
+     */
+    QStringList buildItemPath(QStandardItem *item);
+
+    /**
+     * @brief 根据路径查找对应的节点索引
+     * @param path 路径列表
+     * @return 对应的 QModelIndex,若未找到则无效
+     */
+    QModelIndex findItemByPath(const QStringList &path);
+
+    /**
+     * @brief 检查权限,用于判断某字段/按钮是否可见
+     * @param UserGrade      数据库中存储的权限列表,如 "1,2,3"
+     * @param userPrivilege  当前用户权限
+     * @return 是否包含此权限
+     */
+    bool hasPrivilege(const int &UserGrade, const int &userPrivilege);
+    /**
+     * @brief 实时的数据写入库
+     * @param TableName      数据所在表的name
+     * @param Id            在表中的id
+     * @param currentValue  当前修改的id
+     */
+    void updateDb(const QString &TableName, const int &Id,const QString currentValue);
+public:
+    struct menuInfo{
+        int menuId;
+        bool isthird;
+        int  index;
+
+    };
+    int currentMenuId;
+    std::array<menuInfo,5> menuArray;
+    void loadpage(const int &configId);
+    QList<QStandardItem*> thirdLevelListtest;
+    QStandardItem* deepCopyItem(const QStandardItem *item);
+};
+
+#endif // DBTREEVIEWMANAGER_H

+ 112 - 16
OriginalWnd/MainAndSecondaryCamerasWnd.cpp

@@ -1,4 +1,4 @@
-#include "MainAndSecondaryCamerasWnd.h"
+#include "MainAndSecondaryCamerasWnd.h"
 #include "ui_MainAndSecondaryCamerasWnd.h"
 #include <QSettings>
 #include <QCloseEvent>
@@ -22,6 +22,7 @@ MainAndSecondaryCamerasWnd::MainAndSecondaryCamerasWnd(QWidget *parent)
     settings.endGroup();
 
     initFrom();
+    isShow = true;
 }
 
 MainAndSecondaryCamerasWnd::~MainAndSecondaryCamerasWnd()
@@ -41,12 +42,17 @@ void MainAndSecondaryCamerasWnd::initFrom()
 
     initSliders();
     initLineEdits();
-
+    // 连接 QSlider 的 valueChanged 信号到 QProgressBar 的 setValue 槽
+    connect(ui->RedLightverticalSlider_2, &QSlider::valueChanged, ui->RedLightprogressBar_2, &QProgressBar::setValue);
+    connect(ui->BlueLightverticalSlider, &QSlider::valueChanged, ui->BlueLightprogressBar_2, &QProgressBar::setValue);
+    connect(ui->GreenLightverticalSlider_5, &QSlider::valueChanged, ui->GreenLightprogressBar_5, &QProgressBar::setValue);
+    connect(ui->DotLightverticalSlider_2, &QSlider::valueChanged, ui->DotLightprogressBar_2, &QProgressBar::setValue);
     connectSliderAndLineEdit(ui->RedLightverticalSlider_2, ui->RedLightlineEdit_2);
     connectSliderAndLineEdit(ui->GreenLightverticalSlider_5, ui->GreenLightlineEdit_5);
     connectSliderAndLineEdit(ui->BlueLightverticalSlider, ui->BlueLightlineEdit_2);
     connectSliderAndLineEdit(ui->DotLightverticalSlider_2, ui->DotLightlineEdit_2);
-
+    connect(ui->LeftOperatewidget,&ImageWidget::sendDoubleClicksignal,this,&MainAndSecondaryCamerasWnd::handleDoubleClick);
+    connect(ui->RightOperatewidget,&ImageWidget::sendDoubleClicksignal,this,&MainAndSecondaryCamerasWnd::handleDoubleClick);
     QWidget *viewport = ui->scrollArea->viewport();
     QWidget *container = new QWidget(viewport);
     QHBoxLayout *mainLayout = new QHBoxLayout(container);
@@ -62,7 +68,7 @@ void MainAndSecondaryCamerasWnd::initFrom()
         int num = numbers[i];
         CameraImageHandler* manager = new CameraImageHandler(num);
         Group* widget = manager->getGroup();
-
+        connect(widget,&Group::sendSignal,this,&MainAndSecondaryCamerasWnd::showAndHide);
         if (widget != nullptr) {
             mainLayout->addWidget(widget);
             widgets.append(widget);
@@ -109,6 +115,37 @@ void MainAndSecondaryCamerasWnd::initSliders() {
         sliders[i]->setValue(initialValues[i]);
     }
 }
+void MainAndSecondaryCamerasWnd::initProgressBar(){
+    QList<int> initialValues = {22, 11, 0, 0};
+    QList<QProgressBar*> progressBar = {
+        ui->RedLightprogressBar_2,ui->GreenLightprogressBar_5,
+        ui->BlueLightprogressBar_2,ui->DotLightprogressBar_2
+    };
+    for (int i = 0; i < progressBar.size(); ++i) {
+        progressBar[i]->setMinimum(0);
+        progressBar[i]->setMaximum(100);
+        progressBar[i]->setValue(initialValues[i]);
+    }
+}
+
+void MainAndSecondaryCamerasWnd::handleDoubleClick(){
+    QPoint globalMousePos = QCursor::pos();  // 获取当前鼠标的全局位置
+    QPoint leftWidgetLocalPos = ui->LeftOperatewidget->mapFromGlobal(globalMousePos);
+    QPoint rightWidgetLocalPos = ui->RightOperatewidget->mapFromGlobal(globalMousePos);
+    if (ui->LeftOperatewidget->rect().contains(leftWidgetLocalPos)){
+        QPixmap scaledImage = Left_currentPixmap.scaled(Left_currentPixmap.width(), Left_currentPixmap.height(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
+        ui->LeftOperatewidget->setPixmap(scaledImage); // 这里传递缩放后的图片
+        Left_scaleFactor = 1.0;
+        ui->Leftlabel_Percentage->setText("100%");
+    }
+    if(ui->RightOperatewidget->rect().contains(rightWidgetLocalPos)){
+        QPixmap scaledImage = Right_currentPixmap.scaled(Right_currentPixmap.width(), Right_currentPixmap.height(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
+        ui->RightOperatewidget->setPixmap(scaledImage); // 这里传递缩放后的图片
+        Right_scaleFactor = 1.0;
+        ui->Rightlabel_Percentage->setText("100%");
+    }
+
+}
 
 void MainAndSecondaryCamerasWnd::initLineEdits() {
     QList<QLineEdit*> lineEdits = {
@@ -290,19 +327,20 @@ void MainAndSecondaryCamerasWnd::clearLayout(int flag) {
 
 // 圆晶
 void MainAndSecondaryCamerasWnd::WaferWidget(int flag) {
-    QWidget *operatewidget = ui->LeftOperatewidget;
+    // QWidget *operatewidget = ui->LeftOperatewidget;
 
-    if (flag == 1) {
-        operatewidget = ui->RightOperatewidget;
-    }
+    // if (flag == 1) {
+    //     operatewidget = ui->RightOperatewidget;
+    // }
 
-    QVBoxLayout *layout = new QVBoxLayout(operatewidget);
-    wafer = new Wafer(1, operatewidget);
+    // QGridLayout *layout = new QGridLayout(operatewidget);
+    // wafer = new Wafer(1, operatewidget);
+    // wafer->initFrom(operatewidget);
 
-    layout->setContentsMargins(0, 0, 0, 0);
-    layout->addWidget(wafer);
-    operatewidget->setLayout(layout);
-    operatewidget->setFixedSize(480, 480);
+    // layout->setContentsMargins(0, 0, 0, 0);
+    // layout->addWidget(wafer->globalWidget);
+    // operatewidget->setLayout(layout);
+    // operatewidget->setFixedSize(480, 480);
 }
 
 // 华夫盒
@@ -437,7 +475,8 @@ void MainAndSecondaryCamerasWnd::wheelEvent(QWheelEvent *event)
         int newHeight_left = Left_currentPixmap.height() * Left_scaleFactor;
 
         QPixmap scaledImage_left = Left_currentPixmap.scaled(newWidth_left, newHeight_left, Qt::KeepAspectRatio, Qt::SmoothTransformation);
-        ui->LeftOperatewidget->setPixmap(scaledImage_left);
+        // ui->LeftOperatewidget->setPixmap(scaledImage_left);
+        ui->LeftOperatewidget->setPixmapAndPoint(scaledImage_left);
 
         double percentage_left = Left_scaleFactor * 100;
         QString percentageStr_left = QString::number((int)percentage_left);
@@ -461,7 +500,8 @@ void MainAndSecondaryCamerasWnd::wheelEvent(QWheelEvent *event)
         int newHeight = Right_currentPixmap.height() * Right_scaleFactor;
 
         QPixmap scaledImage = Right_currentPixmap.scaled(newWidth, newHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
-        ui->RightOperatewidget->setPixmap(scaledImage);
+        // ui->RightOperatewidget->setPixmap(scaledImage);
+        ui->RightOperatewidget->setPixmapAndPoint(scaledImage);
 
         double percentage = Right_scaleFactor * 100;
         QString percentageStr = QString::number((int)percentage);
@@ -484,3 +524,59 @@ void MainAndSecondaryCamerasWnd::hideEvent(QHideEvent *event) {
     QMainWindow::hideEvent(event);
 }
 
+void MainAndSecondaryCamerasWnd::showAndHide(){
+    if(isShow == true){
+        isShow = false;
+    }else{
+        isShow = true;
+    }
+    QList<QLineEdit*> lineEdits = {
+        ui->RedLightlineEdit_2, ui->GreenLightlineEdit_5,
+        ui->BlueLightlineEdit_2, ui->DotLightlineEdit_2
+    };
+    QList<QSlider*> sliders = {
+        ui->RedLightverticalSlider_2, ui->GreenLightverticalSlider_5,
+        ui->BlueLightverticalSlider, ui->DotLightverticalSlider_2
+    };
+    QList<QProgressBar*> progressBar = {
+        ui->RedLightprogressBar_2,ui->GreenLightprogressBar_5,
+        ui->BlueLightprogressBar_2,ui->DotLightprogressBar_2
+    };
+    if(isShow == true){
+        for (QLineEdit* lineEdit : lineEdits) {
+            lineEdit->show();
+        }
+        for (int i = 0; i < sliders.size(); ++i) {
+            sliders[i]->show();
+        }
+        for (int i = 0; i < progressBar.size(); ++i) {
+            progressBar[i]->show();
+        }
+        ui->BlueLight->show();
+        ui->RedLight->show();
+        ui->DotLight->show();
+        ui->GreenLight->show();
+        ui->BlueLightlabel_2->show();
+        ui->RedLightlabel_2->show();
+        ui->DotLightlabel_2->show();
+        ui->GreenLightlabel_5->show();
+    }else{
+        for (QLineEdit* lineEdit : lineEdits) {
+            lineEdit->hide();
+        }
+        for (int i = 0; i < sliders.size(); ++i) {
+            sliders[i]->hide();
+        }
+        for (int i = 0; i < progressBar.size(); ++i) {
+            progressBar[i]->hide();
+        }
+        ui->BlueLight->hide();
+        ui->RedLight->hide();
+        ui->DotLight->hide();
+        ui->GreenLight->hide();
+        ui->BlueLightlabel_2->hide();
+        ui->RedLightlabel_2->hide();
+        ui->DotLightlabel_2->hide();
+        ui->GreenLightlabel_5->hide();
+    }
+}

+ 6 - 2
OriginalWnd/MainAndSecondaryCamerasWnd.h

@@ -24,9 +24,12 @@ public:
     void connectSliderAndLineEdit(QSlider* slider, QLineEdit* lineEdit);
     void initLineEdits();
     void initSliders();
-
+    void initProgressBar();
+public slots: // 确保这里声明了槽函数
+    void handleDoubleClick();
+    void showAndHide();
 protected:
-    void wheelEvent(QWheelEvent *event);
+    void wheelEvent(QWheelEvent *event)override;
     void loadSettings();
     void checkSettings();
     void loadGroupSettings(int Id, int Index);
@@ -69,6 +72,7 @@ private:
     Wafer *wafer; // 声明Wafer指针
     Waffle *waffle; // 声明Waffle指针
     MaterialBox *materialbox; // 声明materialbox指针
+    bool isShow;
 };
 
 #endif // MAINANDSECONDARYCAMERASWND_H

+ 64 - 0
OriginalWnd/MainAndSecondaryCamerasWnd.ui

@@ -510,6 +510,22 @@
       <string/>
      </property>
     </widget>
+    <widget class="QProgressBar" name="RedLightprogressBar_2">
+     <property name="geometry">
+      <rect>
+       <x>32</x>
+       <y>15</y>
+       <width>18</width>
+       <height>51</height>
+      </rect>
+     </property>
+     <property name="value">
+      <number>24</number>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+    </widget>
    </widget>
    <widget class="QWidget" name="GreenLight" native="true">
     <property name="geometry">
@@ -559,6 +575,22 @@
       <string/>
      </property>
     </widget>
+    <widget class="QProgressBar" name="GreenLightprogressBar_5">
+     <property name="geometry">
+      <rect>
+       <x>32</x>
+       <y>15</y>
+       <width>18</width>
+       <height>51</height>
+      </rect>
+     </property>
+     <property name="value">
+      <number>24</number>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+    </widget>
    </widget>
    <widget class="QWidget" name="BlueLight" native="true">
     <property name="geometry">
@@ -608,6 +640,22 @@
       <string/>
      </property>
     </widget>
+    <widget class="QProgressBar" name="BlueLightprogressBar_2">
+     <property name="geometry">
+      <rect>
+       <x>32</x>
+       <y>15</y>
+       <width>18</width>
+       <height>51</height>
+      </rect>
+     </property>
+     <property name="value">
+      <number>24</number>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+    </widget>
    </widget>
    <widget class="QWidget" name="DotLight" native="true">
     <property name="geometry">
@@ -657,6 +705,22 @@
       <string/>
      </property>
     </widget>
+    <widget class="QProgressBar" name="DotLightprogressBar_2">
+     <property name="geometry">
+      <rect>
+       <x>32</x>
+       <y>15</y>
+       <width>18</width>
+       <height>51</height>
+      </rect>
+     </property>
+     <property name="value">
+      <number>24</number>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+    </widget>
    </widget>
    <zorder>RightBackGround</zorder>
    <zorder>LeftBackGround</zorder>

+ 18 - 0
OriginalWnd/NonInteractiveCheckDelegate.h

@@ -0,0 +1,18 @@
+#include <QStyledItemDelegate>
+#include <QEvent>
+#include <QAbstractItemModel>
+
+class NonInteractiveCheckDelegate : public QStyledItemDelegate
+{
+public:
+    using QStyledItemDelegate::QStyledItemDelegate;
+
+    bool editorEvent(QEvent *event, QAbstractItemModel *model,
+                     const QStyleOptionViewItem &option,
+                     const QModelIndex &index) override
+    {
+        // 这里直接返回 false 或者不调用父类,实现“禁止点击”。
+        // 这样用户就无法通过鼠标修改复选框状态。
+        return false;
+    }
+};

+ 116 - 65
OriginalWnd/OriginalWnd.cpp

@@ -4,7 +4,8 @@
 #include "OriginalWnd/ChartsAndCamerasWnd.h"
 #include "OriginalWnd/MainAndSecondaryCamerasWnd.h"
 #include "OriginalWnd/SingleCameraOperationWnd.h"
-#include "OriginalWnd/treeviewmanager.h"
+#include "OriginalWnd/DbTreeViewManager.h"
+
 #include <QDebug>
 #include <QJsonDocument>
 #include <QFile>
@@ -17,62 +18,47 @@
 
 OriginalWnd::OriginalWnd(QWidget *parent)
     : QMainWindow(parent)
-    , ui(new Ui::OriginalWnd)
+    , ui(new Ui::OriginalWnd),
+    dbTreeViewManager(nullptr) // 初始化为 nullptr
 {
     ui->setupUi(this);
-    // 初始化 TreeViewManager
-    treeViewManager = new TreeViewManager(this, ui->widget_2);
-    if (!treeViewManager) {
-        qWarning() << "TreeViewManager 初始化失败";
-        return;
-    }
+    if(gen_if.getLanguageValue() == 0){
 
+    }else{
+        setChineseMode(this);
+    }
+    // 确保 ui->widget_2 已经初始化
+    if (!ui->widget_2) {
+        qWarning() << "ui->widget_2 未初始化";
+    }
 
-    // // 获取应用程序目录
-    // QString appDir = QCoreApplication::applicationDirPath();
-    // QDir configDir(appDir);
+    // 初始化 DbTreeViewManager,传递两个参数
+    dbTreeViewManager = new DbTreeViewManager(this, ui->widget_2, this);
 
-    // // 切换到config目录
-    // if (!configDir.cd("config")) {
-    //     qDebug() << "无法切换到config目录:" << configDir.absolutePath();
-    //     return ;
-    // }
+    // 将 DbTreeViewManager 添加到 UI
+    // 假设 ui->widget_2 是你原来放 TreeViewManager 的地方
+    QVBoxLayout *layout = new QVBoxLayout(ui->widget_2);
+    layout->addWidget(dbTreeViewManager);
+    ui->widget_2->setLayout(layout);
 
-    // // 外部路径
-    // QStringList configPaths;
-    // configPaths << configDir.filePath("Home_config.json")
-    //             << configDir.filePath("Production_config.json")
-    //             << configDir.filePath("Diagnosis_config.json")
-    //             << configDir.filePath("Module_config.json")
-    //             << configDir.filePath("Program_config.json")
-    //             << configDir.filePath("Disposition_config.json")
-    //             << configDir.filePath("System_config.json");
+    // 初始化界面
+    initForm();
 
+    // 假设默认加载 Home 配置,权限等级为 "1"
+    // 你需要根据实际登录用户的权限获取
+    int defaultConfigId = 1; // Home_config.json 对应的 ConfigId
+    int userPrivilege = 0x1; // 初始设为 1,后续通过登录获取
+    dbTreeViewManager->initializeTree(defaultConfigId, userPrivilege);
 
 
 
-    // // 定义需要预加载的配置路径
-    QStringList configPaths;
-    configPaths << ":/config/Home_config.json"
-                << ":/config/Production_config.json"
-                << ":/config/Diagnosis_config.json"
-                << ":/config/Module_config.json"
-                << ":/config/Program_config.json"
-                << ":/config/Disposition_config.json"
-                << ":/config/System_config.json";
 
-    // 让 TreeViewManager 把文件都读到内存
+    qDebug() << "UI 初始化完成";
 
-    treeViewManager->preloadAllConfigs(configPaths);
+}
 
-    // 一启动就显示 home_config.json
-    treeViewManager->switchConfig("Home_config.json");
 
 
-    qDebug() << "UI 初始化完成";
-    initForm();
-}
-
 OriginalWnd::~OriginalWnd()
 {
     delete ui;
@@ -86,48 +72,103 @@ QWidget* OriginalWnd::getWidgetLeft() const
 
 void OriginalWnd::switchToHomeConfig()
 {
-    if (treeViewManager) {
-        treeViewManager->switchConfig("Home_config.json");
-    }
+    int configId = 1; // Home_config.json 对应的 ConfigId
+    int userPrivilege = 0x1; // 初始设为 1,后续通过登录获取
+    dbTreeViewManager->initializeTree(configId, userPrivilege);
 }
+
 void OriginalWnd::switchToProductionConfig()
 {
-    if (treeViewManager) {
-        treeViewManager->switchConfig("Production_config.json");
+    int configId = 2; // Production_config.json 对应的 ConfigId
+    int userPrivilege = 0x1; // 初始设为 1,后续通过登录获取
+    dbTreeViewManager->initializeTree(configId, userPrivilege);
+    dbTreeViewManager->currentMenuId = 2;
+    if(dbTreeViewManager->menuArray[0].isthird == true){
+        dbTreeViewManager->loadpage(configId);
+    }else{
+
     }
 }
 
-void OriginalWnd::switchToSystemConfig()
+void OriginalWnd::switchToDiagnosisConfig()
 {
-    if (treeViewManager) {
-        treeViewManager->switchConfig("System_config.json");
+    int configId = 3; // Diagnosis_config.json 对应的 ConfigId
+    int userPrivilege = 0x1; // 初始设为 1,后续通过登录获取
+    dbTreeViewManager->initializeTree(configId, userPrivilege);
+    dbTreeViewManager->currentMenuId = 3;
+    if(dbTreeViewManager->menuArray[2].isthird == true){
+        dbTreeViewManager->loadpage(configId);
+    }else{
+
     }
 }
-void OriginalWnd::switchToProgramConfig()
+
+void OriginalWnd::switchToDispositionConfig()
 {
-    if (treeViewManager) {
-        treeViewManager->switchConfig("Program_config.json");
+    int configId = 6; // Disposition_config.json 对应的 ConfigId
+    int userPrivilege = 0x1; // 初始设为 1,后续通过登录获取
+    dbTreeViewManager->initializeTree(configId, userPrivilege);
+    dbTreeViewManager->currentMenuId = 6;
+    if(dbTreeViewManager->menuArray[4].isthird == true){
+        dbTreeViewManager->loadpage(configId);
+    }else{
+
     }
 }
 
 void OriginalWnd::switchToModuleConfig()
 {
-    if (treeViewManager) {
-        treeViewManager->switchConfig("Module_config.json");
+    int configId = 4; // Module_config.json 对应的 ConfigId
+    int userPrivilege = 0x1; // 初始设为 1,后续通过登录获取
+    dbTreeViewManager->initializeTree(configId, userPrivilege);
+    dbTreeViewManager->currentMenuId = 4;
+    if(dbTreeViewManager->menuArray[3].isthird == true){
+        dbTreeViewManager->loadpage(configId);
+    }else{
+
     }
 }
 
-void OriginalWnd::switchToDispositionConfig()
+void OriginalWnd::switchToProgramConfig()
 {
-    if (treeViewManager) {
-        treeViewManager->switchConfig("Disposition_config.json");
+    int configId = 5; // Program_config.json 对应的 ConfigId
+    int userPrivilege = 0x1; // 初始设为 1,后续通过登录获取
+    dbTreeViewManager->initializeTree(configId, userPrivilege);
+    dbTreeViewManager->currentMenuId = 5;
+    qDebug()<<dbTreeViewManager->menuArray[1].isthird;
+    if(dbTreeViewManager->menuArray[1].isthird == true){
+        dbTreeViewManager->loadpage(configId);
+    }else{
+
     }
 }
-void OriginalWnd::switchToDiagnosisConfig()
+void OriginalWnd::setChineseMode(QMainWindow *OriginalWnd){
+
+        OriginalWnd->setWindowTitle(QCoreApplication::translate("OriginalWnd", "主界面", nullptr));
+        ui->stopButton->setText(QCoreApplication::translate("OriginalWnd", "停止"
+                                                                       , nullptr));
+        ui->startButton->setText(QCoreApplication::translate("OriginalWnd", "启动"
+                                                                        , nullptr));
+        ui->ChartButton->setText(QString());
+        ui->DoubleImageButton->setText(QString());
+        ui->SingleImageButton->setText(QString());
+        ui->pushButton_18->setText(QCoreApplication::translate("OriginalWnd", "PushButton", nullptr));
+        ui->label_name->setText(QCoreApplication::translate("OriginalWnd", "姓名001", nullptr));
+        ui->RegistrationNumber->setText(QCoreApplication::translate("OriginalWnd", "注册号码 001", nullptr));
+        ui->CalibrationButton->setText(QCoreApplication::translate("OriginalWnd", "校准", nullptr));
+        ui->ProductIotNumber->setText(QCoreApplication::translate("OriginalWnd", "xxx生产编号", nullptr));
+        ui->pushButton_2->setText(QString());
+        ui->pushButton_3->setText(QString());
+        ui->label_time->setText(QString());
+        ui->label_username->setText(QString());
+        ui->label_userlogo->setText(QString());
+
+}
+void OriginalWnd::switchToSystemConfig()
 {
-    if (treeViewManager) {
-        treeViewManager->switchConfig("Diagnosis_config.json");
-    }
+    int configId = 7; // System_config.json 对应的 ConfigId
+    int userPrivilege = 0x1; // 初始设为 1,后续通过登录获取
+    dbTreeViewManager->initializeTree(configId, userPrivilege);
 }
 
 
@@ -136,7 +177,10 @@ void OriginalWnd::initForm()
     QTimer *timer = new QTimer(this);
     connect(timer, &QTimer::timeout, this, &OriginalWnd::updateTime);
     timer->start(100);
-
+    //给stopbutton加样式
+    QString stopButton_styleSheet = "QToolButton:hover { background: #cc0000; }"
+                                    "QToolButton:pressed { background: #990000; }";
+    ui->stopButton->setStyleSheet(stopButton_styleSheet);
     ui->stopButton->setIcon(QIcon(":/images/light/stop.png"));
     ui->startButton->setIcon(QIcon(":/images/light/start.png"));
 
@@ -237,8 +281,15 @@ void OriginalWnd::on_startButton_clicked()
 
 void OriginalWnd::on_stopButton_clicked()
 {
-    QString styleSheet1 = "QToolButton { background: #4AB832; color: #FFFFFF; }";
+    QString styleSheet1 = "QToolButton { background: #4AB832; color: #FFFFFF; }"
+                          "QToolButton:hover { background: #00FF00; }";
     ui->startButton->setDisabled(false);
     ui->startButton->setStyleSheet(styleSheet1);
 }
-
+void OriginalWnd::onHandleLanguageSignal(const int &data){
+    if(data == 0){
+        ui->retranslateUi(this);
+    }else{
+        setChineseMode(this);
+    }
+}

+ 24 - 11
OriginalWnd/OriginalWnd.h

@@ -1,9 +1,17 @@
+#pragma once
 #ifndef ORIGINALWND_H
 #define ORIGINALWND_H
 
 #include <QMainWindow>
-#include "treeviewmanager.h"
-
+#include "OriginalWnd/DbTreeViewManager.h"
+#include <QVBoxLayout>
+#include <QJsonObject>
+#include <QMessageBox>
+#include <QDialog>
+#include <QRadioButton>
+#include <QButtonGroup>
+#include <QLabel>
+#include "gen_interface.h"
 QT_BEGIN_NAMESPACE
 namespace Ui { class OriginalWnd; }
 QT_END_NAMESPACE
@@ -17,21 +25,23 @@ public:
     ~OriginalWnd();
     QWidget* getWidgetLeft() const; // 访问 widget 的接口
 
-    void switchToHomeConfig();
+    // 切换不同配置
 
+    void switchToHomeConfig();
     void switchToProductionConfig();
-
-    void switchToSystemConfig();
-
+    void switchToDiagnosisConfig();
+    void switchToDispositionConfig();
     void switchToModuleConfig();
-
     void switchToProgramConfig();
+    void switchToSystemConfig();
+    void setChineseMode(QMainWindow *OriginalWnd);
 
-    void switchToDispositionConfig();
-
-    void switchToDiagnosisConfig();
+    // 当前使用的配置 ID
+    int currentConfigId() const { return m_currentConfigId; }
 
 
+public slots:
+    void onHandleLanguageSignal(const int &data);
 protected:
     bool eventFilter(QObject *obj,QEvent *event);
 
@@ -48,9 +58,12 @@ private slots:
 
 private:
     Ui::OriginalWnd *ui;
-    TreeViewManager *treeViewManager; // 树视图管理器
+    DbTreeViewManager* dbTreeViewManager; // 声明为指针
+    int m_currentConfigId; // 记录当前配置Id,如 1=Home
 
     void initForm(); // 初始化表单控件
+    Gen_Interface gen_if;
 };
 
+
 #endif // ORIGINALWND_H

+ 1 - 1
OriginalWnd/OriginalWnd.ui

@@ -234,7 +234,7 @@ production</string>
       <rect>
        <x>539</x>
        <y>7</y>
-       <width>60</width>
+       <width>101</width>
        <height>30</height>
       </rect>
      </property>

+ 151 - 32
OriginalWnd/SingleCameraOperationWnd.cpp

@@ -1,4 +1,4 @@
-#include "SingleCameraOperationWnd.h"
+#include "SingleCameraOperationWnd.h"
 #include "ui_SingleCameraOperationWnd.h"
 #include <QSettings>
 #include <QCloseEvent>
@@ -12,10 +12,11 @@ SingleCameraOperationWnd::SingleCameraOperationWnd(QWidget *parent)
     , ui(new Ui::SingleCameraOperationWnd), scaleFactor(1.0)
 {
     ui->setupUi(this);
-
+    isShow = true;
     initFrom();
 }
 
+
 SingleCameraOperationWnd::~SingleCameraOperationWnd()
 {
     delete ui;
@@ -33,7 +34,12 @@ void SingleCameraOperationWnd::initFrom() {
 
     initSliders();
     initLineEdits();
-
+    initProgressBar();
+    // 连接 QSlider 的 valueChanged 信号到 QProgressBar 的 setValue 槽
+    connect(ui->RedLightverticalSlider, &QSlider::valueChanged, ui->RedLightprogressBar, &QProgressBar::setValue);
+    connect(ui->BlueLightverticalSlider, &QSlider::valueChanged, ui->BlueLightprogressBar, &QProgressBar::setValue);
+    connect(ui->GreenLightverticalSlider, &QSlider::valueChanged, ui->GreenLightprogressBar, &QProgressBar::setValue);
+    connect(ui->DotLightverticalSlider, &QSlider::valueChanged, ui->DotLightprogressBar, &QProgressBar::setValue);
     connectSliderAndLineEdit(ui->RedLightverticalSlider, ui->RedLightlineEdit);
     connectSliderAndLineEdit(ui->GreenLightverticalSlider, ui->GreenLightlineEdit);
     connectSliderAndLineEdit(ui->BlueLightverticalSlider, ui->BlueLightlineEdit);
@@ -56,7 +62,7 @@ void SingleCameraOperationWnd::initFrom() {
         int num = numbers[i];
         CameraImageHandler* manager = new CameraImageHandler(num);
         Group* widget = manager->getGroup();
-
+        connect(widget,&Group::sendSignal,this,&SingleCameraOperationWnd::showAndHide);
         if (widget != nullptr) {
             layout->addWidget(widget);
             widgets.append(widget);
@@ -78,6 +84,8 @@ void SingleCameraOperationWnd::initFrom() {
     ui->scrollArea->resize(261, 700);
 
     ui->Operatewidget->setMouseTracking(true);
+    connect(ui->Operatewidget,&ImageWidget::sendDoubleClicksignal,this,&SingleCameraOperationWnd::handleDoubleClick);
+
 }
 
 void SingleCameraOperationWnd::closeEvent(QCloseEvent *event) {
@@ -112,6 +120,18 @@ void SingleCameraOperationWnd::initLineEdits() {
         lineEdit->setAlignment(Qt::AlignCenter);
     }
 }
+void SingleCameraOperationWnd::initProgressBar(){
+    QList<int> initialValues = {22, 11, 0, 0};
+    QList<QProgressBar*> progressBar = {
+        ui->RedLightprogressBar,ui->GreenLightprogressBar,
+        ui->BlueLightprogressBar,ui->DotLightprogressBar
+    };
+    for (int i = 0; i < progressBar.size(); ++i) {
+        progressBar[i]->setMinimum(0);
+        progressBar[i]->setMaximum(100);
+        progressBar[i]->setValue(initialValues[i]);
+    }
+}
 
 // void SingleCameraOperationWnd::saveSliderStates() {
 //     QSettings settings("YourCompany", "YourApp");
@@ -239,13 +259,14 @@ void SingleCameraOperationWnd::clearLayout() {
 
 // 圆晶
 void SingleCameraOperationWnd::WaferWidget() {
-    QVBoxLayout *layout = new QVBoxLayout(ui->Operatewidget);
-    wafer = new Wafer(2, ui->Operatewidget);
-
-    layout->setContentsMargins(0, 0, 0, 0);
-    layout->addWidget(wafer);
-    ui->Operatewidget->setLayout(layout);
-    ui->Operatewidget->setFixedSize(786, 786);
+    // QGridLayout *layout = new QGridLayout(ui->Operatewidget);
+    // wafer = new Wafer(2, ui->Operatewidget);
+    // wafer->initFrom(ui->Operatewidget);
+
+    // layout->setContentsMargins(0, 0, 0, 0);
+    // layout->addWidget(wafer->globalWidget);
+    // ui->Operatewidget->setLayout(layout);
+    // ui->Operatewidget->setFixedSize(786, 786);
 }
 
 // 华夫盒
@@ -306,34 +327,68 @@ void SingleCameraOperationWnd::on_ZoomOutButton_clicked() {
     ui->label_Percentage->setText(QString("%1%").arg(percentageStr));
 }
 
+// void SingleCameraOperationWnd::wheelEvent(QWheelEvent *event) {
+//     // 检查鼠标事件是否发生在 Operatewidget 上
+//     if (ui->Operatewidget->rect().contains(ui->Operatewidget->mapFromGlobal(event->globalPos()))) {
+//         if (event->angleDelta().y() > 0) {
+//             scaleFactor *= 1.1;
+//         } else {
+//             double newScaleFactor = scaleFactor * 0.9;
+
+//             // 确保新的缩放因子不小于1.0(即图片的原始大小)
+//             if (newScaleFactor >= 1.0) {
+//                 scaleFactor = newScaleFactor;
+//             } else {
+//                 scaleFactor = 1.0;  // 如果新的缩放因子小于1.0,则直接设置为1.0
+//             }
+//         }
+
+//         int newWidth = currentPixmap.width() * scaleFactor;
+//         int newHeight = currentPixmap.height() * scaleFactor;
+
+//         QPixmap scaledImage = currentPixmap.scaled(newWidth, newHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+//         ui->Operatewidget->setPixmap(scaledImage); // 这里传递缩放后的图片
+
+
+
+//         double percentage = scaleFactor * 100;
+//         QString percentageStr = QString::number((int)percentage);
+//         ui->label_Percentage->setText(QString("%1%").arg(percentageStr));
+//     }
+
+//     QMainWindow::wheelEvent(event);
+// }
 void SingleCameraOperationWnd::wheelEvent(QWheelEvent *event) {
-    // 检查鼠标事件是否发生在 Operatewidget 上
-    if (ui->Operatewidget->rect().contains(ui->Operatewidget->mapFromGlobal(event->globalPos()))) {
-        if (event->angleDelta().y() > 0) {
-            scaleFactor *= 1.1;
-        } else {
-            double newScaleFactor = scaleFactor * 0.9;
-
-            // 确保新的缩放因子不小于1.0(即图片的原始大小)
-            if (newScaleFactor >= 1.0) {
-                scaleFactor = newScaleFactor;
+        // 检查鼠标事件是否发生在 Operatewidget 上
+        if (ui->Operatewidget->rect().contains(ui->Operatewidget->mapFromGlobal(event->globalPos()))) {
+            if (event->angleDelta().y() > 0) {
+                scaleFactor *= 1.1;
             } else {
-                scaleFactor = 1.0;  // 如果新的缩放因子小于1.0,则直接设置为1.0
+                double newScaleFactor = scaleFactor * 0.9;
+
+                // 确保新的缩放因子不小于1.0(即图片的原始大小)
+                if (newScaleFactor >= 1.0) {
+                    scaleFactor = newScaleFactor;
+                } else {
+                    scaleFactor = 1.0;  // 如果新的缩放因子小于1.0,则直接设置为1.0
+                }
             }
-        }
 
-        int newWidth = currentPixmap.width() * scaleFactor;
-        int newHeight = currentPixmap.height() * scaleFactor;
+            int newWidth = currentPixmap.width() * scaleFactor;
+            int newHeight = currentPixmap.height() * scaleFactor;
+            qDebug()<<"11111"<<newWidth<<newHeight;
+            QPixmap scaledImage = currentPixmap.scaled(newWidth, newHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+            // ui->Operatewidget->setPixmap(scaledImage); // 这里传递缩放后的图片
+            ui->Operatewidget->setPixmapAndPoint(scaledImage);
 
-        QPixmap scaledImage = currentPixmap.scaled(newWidth, newHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
-        ui->Operatewidget->setPixmap(scaledImage); // 这里传递缩放后的图片
 
-        double percentage = scaleFactor * 100;
-        QString percentageStr = QString::number((int)percentage);
-        ui->label_Percentage->setText(QString("%1%").arg(percentageStr));
-    }
 
-    QMainWindow::wheelEvent(event);
+            double percentage = scaleFactor * 100;
+            QString percentageStr = QString::number((int)percentage);
+            ui->label_Percentage->setText(QString("%1%").arg(percentageStr));
+        }
+
+        QMainWindow::wheelEvent(event);
 }
 
 void SingleCameraOperationWnd::onComboBoxIndexChanged(int index) {
@@ -370,3 +425,67 @@ void SingleCameraOperationWnd::hideEvent(QHideEvent *event) {
     QMainWindow::hideEvent(event);
 }
 
+void SingleCameraOperationWnd::handleDoubleClick(){
+    QPixmap scaledImage = currentPixmap.scaled(currentPixmap.width(), currentPixmap.height(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
+    ui->Operatewidget->setPixmap(scaledImage); // 这里传递缩放后的图片
+    scaleFactor = 1.0;
+    ui->label_Percentage->setText("100%");
+}
+
+void SingleCameraOperationWnd::showAndHide(){
+    if(isShow == true){
+        isShow = false;
+    }else{
+        isShow = true;
+    }
+    QList<QLineEdit*> lineEdits = {
+        ui->RedLightlineEdit, ui->GreenLightlineEdit,
+        ui->BlueLightlineEdit, ui->DotLightlineEdit,
+    };
+    QList<QSlider*> sliders = {
+        ui->RedLightverticalSlider, ui->GreenLightverticalSlider,
+        ui->BlueLightverticalSlider, ui->DotLightverticalSlider
+    };
+    QList<QProgressBar*> progressBar = {
+        ui->RedLightprogressBar,ui->GreenLightprogressBar,
+        ui->BlueLightprogressBar,ui->DotLightprogressBar
+    };
+    if(isShow == true){
+        for (QLineEdit* lineEdit : lineEdits) {
+            lineEdit->show();
+        }
+        for (int i = 0; i < sliders.size(); ++i) {
+            sliders[i]->show();
+        }
+        for (int i = 0; i < progressBar.size(); ++i) {
+            progressBar[i]->show();
+        }
+        ui->BlueLight->show();
+        ui->RedLight->show();
+        ui->DotLight->show();
+        ui->GreenLight->show();
+        ui->BlueLightlabel->show();
+        ui->RedLightlabel->show();
+        ui->DotLightlabel->show();
+        ui->GreenLightlabel->show();
+    }else{
+        for (QLineEdit* lineEdit : lineEdits) {
+            lineEdit->hide();
+        }
+        for (int i = 0; i < sliders.size(); ++i) {
+            sliders[i]->hide();
+        }
+        for (int i = 0; i < progressBar.size(); ++i) {
+            progressBar[i]->hide();
+        }
+        ui->BlueLight->hide();
+        ui->RedLight->hide();
+        ui->DotLight->hide();
+        ui->GreenLight->hide();
+        ui->BlueLightlabel->hide();
+        ui->RedLightlabel->hide();
+        ui->DotLightlabel->hide();
+        ui->GreenLightlabel->hide();
+    }
+}
+

+ 6 - 2
OriginalWnd/SingleCameraOperationWnd.h

@@ -24,9 +24,10 @@ public:
     void connectSliderAndLineEdit(QSlider* slider, QLineEdit* lineEdit);
     void initSliders();
     void initLineEdits();
+    void initProgressBar();
     // void saveSliderStates();
     // void loadSliderStates();
-    void closeEvent(QCloseEvent *event);
+    void closeEvent(QCloseEvent *event) override;
 
     void loadGroupSettings(int Id, int Index);
 
@@ -38,9 +39,11 @@ public:
 public slots: // 确保这里声明了槽函数
     void onComboBoxIndexChanged(int index); // 确保签名匹配
     QString getImagePathFromIndex(int index);
+    void handleDoubleClick();
+    void showAndHide();
 
 protected:
-    void wheelEvent(QWheelEvent *event);
+    void wheelEvent(QWheelEvent *event) override;
     void loadSettings();
     void checkSettings();
     void showEvent(QShowEvent *event) override;
@@ -66,6 +69,7 @@ private:
     Wafer *wafer; // 声明Wafer指针
     Waffle *waffle; // 声明Waffle指针
     MaterialBox *materialbox; // 声明materialbox指针
+    bool isShow;
 };
 
 #endif // SINGLECAMERAOPERATIONWND_H

+ 64 - 0
OriginalWnd/SingleCameraOperationWnd.ui

@@ -309,6 +309,22 @@
       <string/>
      </property>
     </widget>
+    <widget class="QProgressBar" name="RedLightprogressBar">
+     <property name="geometry">
+      <rect>
+       <x>32</x>
+       <y>15</y>
+       <width>18</width>
+       <height>51</height>
+      </rect>
+     </property>
+     <property name="value">
+      <number>24</number>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+    </widget>
    </widget>
    <widget class="QWidget" name="GreenLight" native="true">
     <property name="geometry">
@@ -358,6 +374,22 @@
       <string/>
      </property>
     </widget>
+    <widget class="QProgressBar" name="GreenLightprogressBar">
+     <property name="geometry">
+      <rect>
+       <x>32</x>
+       <y>15</y>
+       <width>18</width>
+       <height>51</height>
+      </rect>
+     </property>
+     <property name="value">
+      <number>24</number>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+    </widget>
    </widget>
    <widget class="QWidget" name="BlueLight" native="true">
     <property name="geometry">
@@ -407,6 +439,22 @@
       <string/>
      </property>
     </widget>
+    <widget class="QProgressBar" name="BlueLightprogressBar">
+     <property name="geometry">
+      <rect>
+       <x>32</x>
+       <y>15</y>
+       <width>18</width>
+       <height>51</height>
+      </rect>
+     </property>
+     <property name="value">
+      <number>24</number>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+    </widget>
    </widget>
    <widget class="QWidget" name="DotLight" native="true">
     <property name="geometry">
@@ -456,6 +504,22 @@
       <string/>
      </property>
     </widget>
+    <widget class="QProgressBar" name="DotLightprogressBar">
+     <property name="geometry">
+      <rect>
+       <x>32</x>
+       <y>15</y>
+       <width>18</width>
+       <height>51</height>
+      </rect>
+     </property>
+     <property name="value">
+      <number>24</number>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+    </widget>
    </widget>
    <zorder>BackGround</zorder>
    <zorder>DatacomboBox</zorder>

+ 4 - 4
OriginalWnd/chartline.cpp

@@ -28,17 +28,17 @@ ChartLine::ChartLine(QWidget *parent)
     m_axisX->setRange(0, 40);
     m_axisX->setTickCount(9);
     m_axisX->setLabelFormat("%.0f");
-    m_axisX->setTitleFont(QFont("思源黑体", 6));
+    m_axisX->setTitleFont(QFont("思源黑体", 10));
     m_axisX->setTitleBrush(QBrush(QColor("#1D2087")));
 
     m_axisY->setRange(-60, 120);
     m_axisY->setTickCount(7);
     m_axisY->setLabelFormat("%.0f");
-    m_axisY->setTitleFont(QFont("思源黑体", 5));
+    m_axisY->setTitleFont(QFont("思源黑体", 10));
     m_axisY->setTitleBrush(QBrush(QColor("#1D2087")));
 
     // 图表标题 + 隐藏图例
-    m_chart->setTitleFont(QFont("思源黑体", 6));
+    m_chart->setTitleFont(QFont("思源黑体", 10));
     m_chart->setTitleBrush(QBrush(QColor("#1D2087")));
     m_chart->legend()->hide();
 
@@ -65,7 +65,7 @@ ChartLine::ChartLine(QWidget *parent)
     m_axisX->setGridLineVisible(false);
 
 
-    QFont axisFont("思源黑体", 4); // 第二个参数是字号,数值越小,文字越小
+    QFont axisFont("思源黑体", 6); // 第二个参数是字号,数值越小,文字越小
     m_axisX->setLabelsFont(axisFont);
     m_axisY->setLabelsFont(axisFont);
 

+ 15 - 7
SBTdie-bonder-ui.pro

@@ -1,11 +1,10 @@
-QT       += core gui
-QT += charts
-
+QT       += core gui sql charts
 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
 CONFIG += c++17
 
-LIBS += -L"D:\qt\Interface_1.1" -lInterface
+#LIBS += -L"D:\qt\Interface_1.1" -lInterface
+# LIBS += -L"C:\Users\David\Desktop\Interface_1.1" -lInterface
 
 # You can make your code fail to compile if it uses deprecated APIs.
 # In order to do so, uncomment the following line.
@@ -14,18 +13,21 @@ LIBS += -L"D:\qt\Interface_1.1" -lInterface
 SOURCES += \
     CameraMaterialGroupWnd/CameraImage/CameraImageHandler.cpp \
     CameraMaterialGroupWnd/Group.cpp \
+    CameraMaterialGroupWnd/MaterialWindow/DieItem.cpp \
     CameraMaterialGroupWnd/MaterialWindow/MaterialBox.cpp \
     CameraMaterialGroupWnd/MaterialWindow/Wafer.cpp \
+    CameraMaterialGroupWnd/MaterialWindow/WaferGraphicsView.cpp \
     CameraMaterialGroupWnd/MaterialWindow/Waffle.cpp \
     ImageWidget.cpp \
     ImageWidget_nodrag.cpp \
     Login.cpp \
     OriginalWnd/ChartsAndCamerasWnd.cpp \
+    OriginalWnd/DbTreeViewManager.cpp \
     OriginalWnd/MainAndSecondaryCamerasWnd.cpp \
     OriginalWnd/OriginalWnd.cpp \
     OriginalWnd/SingleCameraOperationWnd.cpp \
     OriginalWnd/chartline.cpp \
-    OriginalWnd/treeviewmanager.cpp \
+    gen_interface.cpp \
     main.cpp \
     MainWnd.cpp \
 
@@ -33,19 +35,23 @@ HEADERS += \
     CInterface.h \
     CameraMaterialGroupWnd/CameraImage/CameraImageHandler.h \
     CameraMaterialGroupWnd/Group.h \
+    CameraMaterialGroupWnd/MaterialWindow/DieItem.h \
     CameraMaterialGroupWnd/MaterialWindow/MaterialBox.h \
     CameraMaterialGroupWnd/MaterialWindow/Wafer.h \
+    CameraMaterialGroupWnd/MaterialWindow/WaferGraphicsView.h \
     CameraMaterialGroupWnd/MaterialWindow/Waffle.h \
     ImageWidget.h \
     ImageWidget_nodrag.h \
     Login.h \
     MainWnd.h \
     OriginalWnd/ChartsAndCamerasWnd.h \
+    OriginalWnd/DbTreeViewManager.h \
     OriginalWnd/MainAndSecondaryCamerasWnd.h \
+    OriginalWnd/NonInteractiveCheckDelegate.h \
     OriginalWnd/OriginalWnd.h \
     OriginalWnd/SingleCameraOperationWnd.h \
     OriginalWnd/chartline.h \
-    OriginalWnd/treeviewmanager.h \
+    gen_interface.h
 
 FORMS += \
     CameraMaterialGroupWnd/Group.ui \
@@ -63,7 +69,9 @@ qnx: target.path = /tmp/$${TARGET}/bin
 else: unix:!android: target.path = /opt/$${TARGET}/bin
 !isEmpty(target.path): INSTALLS += target
 
-DISTFILES +=
+DISTFILES += \
+    configurations.db \
+    dark.qss
 
 RESOURCES += \
     res.qrc

+ 16 - 208
SBTdie-bonder-ui.pro.user

@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 14.0.2, 2025-01-12T17:59:35. -->
+<!-- Written by QtCreator 15.0.0, 2025-02-11T10:24:37. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
-  <value type="QByteArray">{18ca618c-d623-4564-b8b0-9ee73c53f748}</value>
+  <value type="QByteArray">{e1544cc0-8ac2-4740-93f8-2f17cf3eecf0}</value>
  </data>
  <data>
   <variable>ProjectExplorer.Project.ActiveTarget</variable>
@@ -33,6 +33,7 @@
    <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
    <value type="int" key="EditorConfiguration.IndentSize">4</value>
    <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
+   <value type="int" key="EditorConfiguration.LineEndingBehavior">0</value>
    <value type="int" key="EditorConfiguration.MarginColumn">80</value>
    <value type="bool" key="EditorConfiguration.MouseHiding">true</value>
    <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
@@ -85,194 +86,22 @@
     <valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
     <value type="bool" key="ClangTools.UseGlobalSettings">true</value>
    </valuemap>
-   <valuemap type="QVariantMap" key="CppEditor.QuickFix">
-    <value type="bool" key="UseGlobalSettings">true</value>
-   </valuemap>
   </valuemap>
  </data>
  <data>
   <variable>ProjectExplorer.Project.Target.0</variable>
   <valuemap type="QVariantMap">
    <value type="QString" key="DeviceType">Desktop</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.15.2 MSVC2019 64bit</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.15.2 MSVC2019 64bit</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5152.win64_msvc2019_64_kit</value>
-   <value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
-   <value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
-   <value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
-    <value type="int" key="EnableQmlDebugging">0</value>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\qt\9998\die-bonder-ui\build\Desktop_Qt_5_15_2_MSVC2019_64bit-Debug</value>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/qt/9998/die-bonder-ui/build/Desktop_Qt_5_15_2_MSVC2019_64bit-Debug</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
-      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
-      <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
-     </valuemap>
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-     </valuemap>
-     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">构建</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
-    </valuemap>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
-     </valuemap>
-     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清除</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">清除</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
-    </valuemap>
-    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
-    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
-    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
-    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
-    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
-    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
-   </valuemap>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\qt\234\die-bonder-ui\die-bonder-ui\build\Desktop_Qt_5_15_2_MSVC2019_64bit-Release</value>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/qt/234/die-bonder-ui/die-bonder-ui/build/Desktop_Qt_5_15_2_MSVC2019_64bit-Release</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
-      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
-      <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
-     </valuemap>
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-     </valuemap>
-     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">构建</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
-    </valuemap>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
-     </valuemap>
-     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清除</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">清除</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
-    </valuemap>
-    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
-    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
-    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
-    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
-    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
-    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
-    <value type="int" key="QtQuickCompiler">0</value>
-   </valuemap>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
-    <value type="int" key="EnableQmlDebugging">0</value>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\qt\234\die-bonder-ui\die-bonder-ui\build\Desktop_Qt_5_15_2_MSVC2019_64bit-Profile</value>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/qt/234/die-bonder-ui/die-bonder-ui/build/Desktop_Qt_5_15_2_MSVC2019_64bit-Profile</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
-      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
-      <valuelist type="QVariantList" key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
-     </valuemap>
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-     </valuemap>
-     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">构建</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
-    </valuemap>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
-     </valuemap>
-     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清除</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">清除</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
-    </valuemap>
-    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
-    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
-    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
-    <value type="bool" key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
-    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
-    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
-    <value type="int" key="QtQuickCompiler">0</value>
-    <value type="int" key="SeparateDebugInfo">0</value>
-   </valuemap>
-   <value type="qlonglong" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <value type="qlonglong" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">部署</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">部署</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
-    </valuemap>
-    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.DeployConfiguration.CustomData"/>
-    <value type="bool" key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
-   </valuemap>
-   <value type="qlonglong" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
-    <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
-    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
-    <value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
-    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
-    <value type="QList&lt;int&gt;" key="Analyzer.Valgrind.VisibleErrorKinds"></value>
-    <valuelist type="QVariantList" key="CustomOutputParsers"/>
-    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
-    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-    <value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
-    <value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph &quot;dwarf,4096&quot; -F 250</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">SBTdie-bonder-ui2</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:D:/qt/9998/die-bonder-ui/SBTdie-bonder-ui.pro</value>
-    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">D:/qt/9998/die-bonder-ui/SBTdie-bonder-ui.pro</value>
-    <value type="bool" key="ProjectExplorer.RunConfiguration.Customized">true</value>
-    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
-    <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
-    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
-    <value type="QString" key="RunConfiguration.WorkingDirectory.default">D:/qt/9998/die-bonder-ui/build/Desktop_Qt_5_15_2_MSVC2019_64bit-Debug</value>
-   </valuemap>
-   <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
-  </valuemap>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.Target.1</variable>
-  <valuemap type="QVariantMap">
-   <value type="QString" key="DeviceType">Desktop</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.15.2 MinGW 64-bit</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.15.2 MinGW 64-bit</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5152.win64_mingw81_kit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.15.2 MinGW 32-bit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.15.2 MinGW 32-bit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5152.win32_mingw81_kit</value>
    <value type="qlonglong" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
    <value type="qlonglong" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
    <value type="qlonglong" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
     <value type="int" key="EnableQmlDebugging">0</value>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\qt\234\die-bonder-ui\die-bonder-ui\build\Desktop_Qt_5_15_2_MinGW_64_bit-Debug</value>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/qt/234/die-bonder-ui/die-bonder-ui/build/Desktop_Qt_5_15_2_MinGW_64_bit-Debug</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\Administrator\Desktop\qt\gerrit\die-bonder-ui\build\Desktop_Qt_5_15_2_MinGW_32_bit-Debug</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/Administrator/Desktop/qt/gerrit/die-bonder-ui/build/Desktop_Qt_5_15_2_MinGW_32_bit-Debug</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
@@ -310,8 +139,8 @@
     <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\qt\3\die-bonder-ui\build\Desktop_Qt_5_15_2_MinGW_64_bit-Release</value>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/qt/3/die-bonder-ui/build/Desktop_Qt_5_15_2_MinGW_64_bit-Release</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\Administrator\Desktop\qt\gerrit\die-bonder-ui\build\Desktop_Qt_5_15_2_MinGW_32_bit-Release</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/Administrator/Desktop/qt/gerrit/die-bonder-ui/build/Desktop_Qt_5_15_2_MinGW_32_bit-Release</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
@@ -351,8 +180,8 @@
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
     <value type="int" key="EnableQmlDebugging">0</value>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\qt\3\die-bonder-ui\build\Desktop_Qt_5_15_2_MinGW_64_bit-Profile</value>
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/qt/3/die-bonder-ui/build/Desktop_Qt_5_15_2_MinGW_64_bit-Profile</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\Administrator\Desktop\qt\gerrit\die-bonder-ui\build\Desktop_Qt_5_15_2_MinGW_32_bit-Profile</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/Administrator/Desktop/qt/gerrit/die-bonder-ui/build/Desktop_Qt_5_15_2_MinGW_32_bit-Profile</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
@@ -410,45 +239,24 @@
     <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
     <value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
     <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
-    <value type="QList&lt;int&gt;" key="Analyzer.Valgrind.VisibleErrorKinds"></value>
-    <valuelist type="QVariantList" key="CustomOutputParsers"/>
-    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
-    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-    <value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
-    <value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph &quot;dwarf,4096&quot; -F 250</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">SBTdie-bonder-ui2</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:D:/qt/999/die-bonder-ui/SBTdie-bonder-ui.pro</value>
-    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">D:/qt/999/die-bonder-ui/SBTdie-bonder-ui.pro</value>
-    <value type="bool" key="ProjectExplorer.RunConfiguration.Customized">true</value>
-    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
-    <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
-    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
-   </valuemap>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.1">
-    <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
-    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
-    <value type="int" key="Analyzer.Valgrind.Callgrind.CostFormat">0</value>
-    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
-    <value type="QList&lt;int&gt;" key="Analyzer.Valgrind.VisibleErrorKinds"></value>
     <valuelist type="QVariantList" key="CustomOutputParsers"/>
     <value type="int" key="PE.EnvironmentAspect.Base">2</value>
     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
     <value type="bool" key="PE.EnvironmentAspect.PrintOnRun">false</value>
     <value type="QString" key="PerfRecordArgsId">-e cpu-cycles --call-graph &quot;dwarf,4096&quot; -F 250</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:D:/qt/234/die-bonder-ui/die-bonder-ui/SBTdie-bonder-ui.pro</value>
-    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">D:/qt/234/die-bonder-ui/die-bonder-ui/SBTdie-bonder-ui.pro</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
+    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value>
     <value type="bool" key="ProjectExplorer.RunConfiguration.Customized">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
-    <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
     <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
    </valuemap>
-   <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">2</value>
+   <value type="qlonglong" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
   </valuemap>
  </data>
  <data>
   <variable>ProjectExplorer.Project.TargetCount</variable>
-  <value type="qlonglong">2</value>
+  <value type="qlonglong">1</value>
  </data>
  <data>
   <variable>ProjectExplorer.Project.Updater.FileVersion</variable>

BIN
configurations.db


+ 592 - 0
dark.qss

@@ -0,0 +1,592 @@
+* {
+    font-family: "思源黑体M", "Source Han Sans", "Microsoft YaHei", sans-serif; /* 确保字体的兼容性 */
+    font-size: 14px;
+    font-weight: normal;
+    outline: 0px;
+}
+
+/*登录*/
+Login QWidget#widget_2
+{
+    background-image: url(:/images/login.png);
+}
+
+Login QWidget#widget
+{
+    border-radius: 20px;
+    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6164D6, stop: 1 #6164D6); /* 第一层渐变 */
+}
+
+Login QPushButton
+{
+    color:#FFFFFF;
+    border-radius: 8px;
+    background: #9294FF;
+}
+
+Login QLineEdit#userNameLineEdit,
+Login QLineEdit#passLineEdit
+{
+    color:#FFFFFF;
+    border-radius: 8px;
+    padding-left:82px;
+    border: 1px solid #9294FF;
+    background: rgba(111, 113, 223, 0.2);
+}
+
+Login QLabel#label_user
+{
+    image: url(:/images/login_user.png);
+}
+
+Login QLabel#label_pass
+{
+    image: url(:/images/login_pass.png);
+}
+
+Login QFrame#line,
+Login QFrame#line_2
+{
+    background: #9294FF;
+}
+
+
+/*主界面*/
+MainWnd QWidget#TabSideBar
+{
+    /*background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #EEF0F8, stop: 1 #E6E7F9);*/
+    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 rgba(238, 240, 248, 0.1), stop: 1 rgba(230, 231, 249, 0.1));
+}
+
+MainWnd QWidget#centralwidget
+{
+    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 rgba(238, 240, 248, 0.1), stop: 1 rgba(230, 231, 249, 0.1));
+}
+
+MainWnd QFrame#line,
+OriginalWnd QFrame#line_2,
+QFrame#line_3,
+SingleCameraOperationWnd QFrame#line_2,
+MainAndSecondaryCamerasWnd QFrame#line_16,
+ChartsAndCamerasWnd QFrame#line_2
+{
+    border:none;
+    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 rgba(238, 240, 248, 0.1), stop: 1 rgba(230, 231, 249, 0.1));
+}
+
+MainWnd QWidget#TabSideBar QToolButton
+{
+    color: #1D2087;
+    font-weight: bold;
+    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 rgba(238, 240, 248, 0.1), stop: 1 rgba(230, 231, 249, 0.1));
+    border-radius:6px;
+}
+
+/*侧边栏按钮*/
+QWidget#TabSideBar>QToolButton::hover,QWidget#TabSideBar>QToolButton::checked
+{
+    border:none;
+    color:#FFFFFF;
+    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 rgba(238, 240, 248, 0.1), stop: 1 rgba(230, 231, 249, 0.1));
+}
+
+MainWnd QToolButton
+{
+    padding-top: 8px;
+}
+
+QWidget#TabSideBar>QToolButton#tabHomeBtn
+{
+    qproperty-icon:url(:/images/light/home.png);
+}
+
+QWidget#TabSideBar>QToolButton#tabProductionBtn
+{
+    qproperty-icon:url(:/images/light/Productionn assistance.png);
+}
+
+QWidget#TabSideBar>QToolButton#tabProgramBtn
+{
+    qproperty-icon:url(:/images/light/Program.png);
+}
+
+QWidget#TabSideBar>QToolButton#tabMessageBtn
+{
+    qproperty-icon:url(:/images/light/Message.png);
+}
+
+QWidget#TabSideBar>QToolButton#tabModuleBtn
+{
+    qproperty-icon:url(:/images/light/Module.png);
+}
+
+QWidget#TabSideBar>QToolButton#tabDispositionBtn
+{
+    qproperty-icon:url(:/images/light/Disposition.png);
+}
+
+QWidget#TabSideBar>QToolButton#tabDiagnosisBtn
+{
+    qproperty-icon:url(:/images/light/Diagnosis.png);
+}
+
+QWidget#TabSideBar>QToolButton#tabSystemBtn
+{
+    qproperty-icon:url(:/images/light/System.png);
+}
+
+QWidget#TabSideBar>QToolButton#tabHelpBtn
+{
+    qproperty-icon:url(:/images/light/Help.png);
+}
+
+/*顶部*/
+QWidget#Toptitlebar
+{
+    /*border-radius: 6px;*/
+    background: #5C63BE;
+    color: #FFFFFF;
+}
+
+QWidget#Toptitlebar QLable#label_4
+{
+    color: #FFFFFF;
+}
+
+OriginalWnd QWidget#Toptitlebar QPushButton#CalibrationButton
+{
+    color: #FFFFFF;
+    border-radius: 4px;
+    background: #4AA2FF;
+}
+
+QWidget#Toptitlebar QPushButton#pushButton_2
+{
+    background-color: transparent;
+    image: url(:/images/TopStatusBar/MachineLink.png);
+}
+
+QWidget#Toptitlebar QPushButton#pushButton_3
+{
+    background-color: transparent;
+    image: url(:/images/TopStatusBar/HostStatus.png);
+}
+
+/*初始界面*/
+OriginalWnd QWidget#widget_2,
+OriginalWnd QWidget#widget
+{
+    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #F1F4FD, stop: 1 #E5E4F6);
+    border-radius: 10px;
+}
+
+
+OriginalWnd QWidget#widget QToolButton#stopButton
+{
+    border-radius: 6px;
+    background: #F02962;
+    color: #FFFFFF;
+    padding-bottom: 10px;
+    padding-left: 9px;
+}
+
+OriginalWnd QWidget#widget QToolButton#startButton
+{
+    border-radius: 6px;
+    background: #4AB832;
+    color: #FFFFFF;
+    padding-bottom: 10px;
+    padding-left: 9px;
+}
+
+OriginalWnd QWidget#widget QPushButton#ChartButton:hover,
+OriginalWnd QWidget#widget QPushButton#DoubleImageButton:hover,
+OriginalWnd QWidget#widget QPushButton#SingleImageButton:hover,
+OriginalWnd QWidget#widget QPushButton#ChartButton:checked,
+OriginalWnd QWidget#widget QPushButton#DoubleImageButton:checked,
+OriginalWnd QWidget#widget QPushButton#SingleImageButton:checked
+{
+    background: #A9B4FF;
+}
+
+OriginalWnd QWidget#widget QPushButton#ChartButton
+{
+    border-radius: 6px;
+    background: #CBD0FF;
+    image: url(:/images/light/Demo001_1.png);
+}
+
+OriginalWnd QWidget#widget QPushButton#DoubleImageButton
+{
+    border-radius: 6px;
+    background: #CBD0FF;
+    image: url(:/images/light/Demo001_2.png);
+}
+
+OriginalWnd QWidget#widget QPushButton#SingleImageButton
+{
+    border-radius: 6px;
+    background: #CBD0FF;
+    image: url(:/images/light/Demo001_3.png);
+}
+
+/* SingleCameraOperationWnd */
+QComboBox
+{
+    border:1px solid #BABBDC;
+    border-radius:6px;
+    background:#FFFFFF;
+}
+
+QComboBox::down-arrow
+{
+    image: url(:/images/drop.png);
+    width: 30px;
+    height:30px;
+}
+
+QComboBox::drop-down
+{
+    width:20px;
+    border:none;
+    padding-right:5px;
+}
+
+SingleCameraOperationWnd QWidget#centralwidget,
+MainAndSecondaryCamerasWnd QWidget#centralwidget,
+ChartsAndCamerasWnd QWidget#Leftwidget,
+ChartsAndCamerasWnd QWidget#Rightwidget
+{
+    border-radius: 10px;
+    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #F1F4FD, stop: 1 #E5E4F6);
+}
+
+Group QPushButton#GroupButton
+{
+    image: url(:/images/LightGroup/LightSwitch.png);
+    border-radius: 6px;
+    background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #949FE8,stop:1 #2D309B);
+}
+
+SingleCameraOperationWnd QPushButton#LiveButton,
+MainAndSecondaryCamerasWnd QPushButton#LeftLiveButton,
+MainAndSecondaryCamerasWnd QPushButton#RightLiveButton,
+ChartsAndCamerasWnd QPushButton#LiveButton
+{
+    color: #FFFFFF;
+    border-radius: 6px;
+    background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #949FE8,stop:1 #2D309B);
+}
+
+SingleCameraOperationWnd QWidget#RedLight,
+SingleCameraOperationWnd QWidget#GreenLight,
+SingleCameraOperationWnd QWidget#BlueLight,
+SingleCameraOperationWnd QWidget#DotLight,
+MainAndSecondaryCamerasWnd QWidget#RedLight,
+MainAndSecondaryCamerasWnd QWidget#GreenLight,
+MainAndSecondaryCamerasWnd QWidget#BlueLight,
+MainAndSecondaryCamerasWnd QWidget#DotLight,
+ChartsAndCamerasWnd QWidget#RedLight,
+ChartsAndCamerasWnd QWidget#GreenLight,
+ChartsAndCamerasWnd QWidget#BlueLight,
+ChartsAndCamerasWnd QWidget#DotLight
+{
+    background: #D6D8ED;
+}
+
+SingleCameraOperationWnd QLineEdit,
+MainAndSecondaryCamerasWnd QLineEdit,
+ChartsAndCamerasWnd QLineEdit
+{
+    border-radius: 6px;
+    border: 1px solid #BABBDC;
+}
+
+SingleCameraOperationWnd QWidget#BackGround,
+MainAndSecondaryCamerasWnd QWidget#LeftBackGround,
+MainAndSecondaryCamerasWnd QWidget#RightBackGround,
+ChartsAndCamerasWnd QWidget#BackGround
+{
+    background: #FFFFFF;
+    border: 1px solid #BABBDC;
+    border-radius: 0px;
+}
+
+SingleCameraOperationWnd QLabel#RedLightlabel,
+MainAndSecondaryCamerasWnd QLabel#RedLightlabel_2,
+ChartsAndCamerasWnd QLabel#RedLightlabel
+{
+    image: url(:/images/LightGroup/RedLight.png);
+}
+
+SingleCameraOperationWnd QLabel#GreenLightlabel,
+MainAndSecondaryCamerasWnd QLabel#GreenLightlabel_5,
+ChartsAndCamerasWnd QLabel#GreenLightlabel
+{
+    image: url(:/images/LightGroup/GreenLight.png);
+}
+
+SingleCameraOperationWnd QLabel#BlueLightlabel,
+MainAndSecondaryCamerasWnd QLabel#BlueLightlabel_2,
+ChartsAndCamerasWnd QLabel#BlueLightlabel
+{
+    image: url(:/images/LightGroup/BlueLight.png);
+}
+
+SingleCameraOperationWnd QLabel#DotLightlabel,
+MainAndSecondaryCamerasWnd QLabel#DotLightlabel_2,
+ChartsAndCamerasWnd QLabel#DotLightlabel
+{
+    image: url(:/images/LightGroup/DotLight.png);
+}
+
+/* 工具栏 */
+SingleCameraOperationWnd QWidget#Toolbar,
+MainAndSecondaryCamerasWnd QWidget#LeftToolbar,
+MainAndSecondaryCamerasWnd QWidget#RightToolbar,
+ChartsAndCamerasWnd QWidget#Toolbar
+{
+    border-radius: 6px;
+    background: #CBD0FF;
+}
+
+SingleCameraOperationWnd QWidget#Toolbar QPushButton,
+MainAndSecondaryCamerasWnd QWidget#LeftToolbar QPushButton,
+MainAndSecondaryCamerasWnd QWidget#RightToolbar QPushButton,
+ChartsAndCamerasWnd QWidget#Toolbar QPushButton
+{
+    border-radius: 6px;
+    background: #CBD0FF;
+    border:none;
+}
+
+SingleCameraOperationWnd QFrame#line,
+SingleCameraOperationWnd QFrame#line_3,
+SingleCameraOperationWnd QFrame#line_4,
+SingleCameraOperationWnd QFrame#line_5,
+SingleCameraOperationWnd QFrame#line_6,
+MainAndSecondaryCamerasWnd QFrame#line_1,
+MainAndSecondaryCamerasWnd QFrame#line_3,
+MainAndSecondaryCamerasWnd QFrame#line_4,
+MainAndSecondaryCamerasWnd QFrame#line_5,
+MainAndSecondaryCamerasWnd QFrame#line_6,
+MainAndSecondaryCamerasWnd QFrame#line_11,
+MainAndSecondaryCamerasWnd QFrame#line_12,
+MainAndSecondaryCamerasWnd QFrame#line_13,
+MainAndSecondaryCamerasWnd QFrame#line_14,
+MainAndSecondaryCamerasWnd QFrame#line_15,
+ChartsAndCamerasWnd QFrame#line,
+ChartsAndCamerasWnd QFrame#line_3,
+ChartsAndCamerasWnd QFrame#line_4,
+ChartsAndCamerasWnd QFrame#line_5,
+ChartsAndCamerasWnd QFrame#line_6
+{
+    border:none;
+    background-color: rgba(78, 81, 206, 0.5);
+}
+
+SingleCameraOperationWnd QPushButton#pushButton_2,
+SingleCameraOperationWnd QLabel#label_Percentage,
+MainAndSecondaryCamerasWnd QPushButton#pushButton_2,
+MainAndSecondaryCamerasWnd QLabel#Leftlabel_Percentage,
+MainAndSecondaryCamerasWnd QPushButton#pushButton_4,
+MainAndSecondaryCamerasWnd QLabel#Rightlabel_Percentage,
+ChartsAndCamerasWnd QPushButton#pushButton_2,
+ChartsAndCamerasWnd QLabel#label_Percentage
+{
+    color: #4E51CE;
+}
+
+SingleCameraOperationWnd QPushButton#ZoomUpButton,
+MainAndSecondaryCamerasWnd QPushButton#LeftZoomUpButton,
+MainAndSecondaryCamerasWnd QPushButton#RightZoomUpButton,
+ChartsAndCamerasWnd QPushButton#ZoomUpButton
+{
+    image: url(:/images/light/zoom up.png);
+}
+
+SingleCameraOperationWnd QPushButton#ZoomOutButton,
+MainAndSecondaryCamerasWnd QPushButton#LeftZoomOutButton,
+MainAndSecondaryCamerasWnd QPushButton#RightZoomOutButton,
+ChartsAndCamerasWnd QPushButton#ZoomOutButton
+{
+    image: url(:/images/light/zoom out.png);
+}
+
+SingleCameraOperationWnd QPushButton#RulerButton,
+MainAndSecondaryCamerasWnd QPushButton#LeftRulerButton,
+MainAndSecondaryCamerasWnd QPushButton#RightRulerButton,
+ChartsAndCamerasWnd QPushButton#RulerButton
+{
+    image: url(:/images/light/ruler.png);
+}
+
+SingleCameraOperationWnd QPushButton#PenButton,
+MainAndSecondaryCamerasWnd QPushButton#LeftPenButton,
+MainAndSecondaryCamerasWnd QPushButton#RightPenButton,
+ChartsAndCamerasWnd QPushButton#PenButton
+{
+    image: url(:/images/light/pen.png);
+}
+
+/* 为垂直滑块设置样式 */
+QSlider::groove:vertical {
+    height: 56px;
+    width: 3px;
+    background: rgba(78, 81, 206, 0.25);
+}
+
+QSlider::sub-page:vertical {
+    height: 56px;
+    width: 3px;
+    background: rgba(78, 81, 206, 0.25);
+}
+
+QSlider::handle:vertical {
+    border-image: url(:/images/LightGroup/slider.png);
+    height: 6px;
+    margin: 0px -5px 0px -5px;
+    border-radius: 4px;
+}
+
+QScrollArea {
+    background-color: transparent;
+    border: none;
+}
+
+QScrollArea QWidget {
+    background-color: transparent;
+}
+
+
+QScrollBar
+{
+    background:transparent;
+    width:10px;
+    height:10px;
+    border-radius:5px;
+    border-style: solid;
+}
+
+QScrollBar::handle
+{
+    background: #B5B9ED;
+    border-radius: 5px;
+}
+
+QScrollBar::sub-page
+{
+    background:transparent;
+    border:none;
+}
+
+QScrollBar::add-page
+{
+    background:transparent;
+    border:none;
+}
+
+QScrollBar::up-arrow
+{
+    background:transparent;
+    border-top-left-radius:5px;
+    border-top-right-radius:5px;
+}
+
+QScrollBar::down-arrow
+{
+    background:transparent;
+    border-bottom-left-radius:5px;
+    border-bottom-right-radius:5px;
+}
+
+QScrollBar::sub-line
+{
+    background:transparent;
+    border-radius: 5px;
+}
+
+QScrollBar::add-line
+{
+    background:transparent;
+    border-radius: 5px;
+}
+
+ChartsAndCamerasWnd QWidget#Checkwidget
+{
+    border-radius: 6px;
+    border: 1px solid #BABBDC;
+}
+
+ChartsAndCamerasWnd QCheckBox {
+    border: 0px solid #FFFFFF;
+    padding: 4px;
+    spacing: 18px;
+}
+
+ChartsAndCamerasWnd QCheckBox::indicator{
+    border: 1px solid #BABBDC;
+    width: 12px;
+    height: 12px;
+    border-radius: 2px;
+    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0.01 #FFFFFF, stop: 1 #F2F2FA);
+}
+
+ChartsAndCamerasWnd QCheckBox::indicator:checked {
+    image: url(:/images/check_selected.png);
+}
+
+ChartsAndCamerasWnd QLabel#GreenDiamond
+{
+    image: url(:/images/Participation display/GreenDiamond.png);
+}
+
+ChartsAndCamerasWnd QLabel#RedDiamond
+{
+    image: url(:/images/Participation display/RedDiamond.png);
+}
+
+ChartsAndCamerasWnd QLabel#BlueDiamond
+{
+    image: url(:/images/Participation display/BlueDiamond.png);
+}
+
+ChartsAndCamerasWnd QLabel#YellowDiamond
+{
+    image: url(:/images/Participation display/YellowDiamond.png);
+}
+
+ChartsAndCamerasWnd QLabel#BlackDiamond
+{
+    image: url(:/images/Participation display/BlackDiamond.png);
+}
+
+ChartsAndCamerasWnd QLabel#WhiteVerticalBar
+{
+    image: url(:/images/Participation display/White vertical bars.png);
+}
+
+ChartsAndCamerasWnd QLabel#RedHorizontalLine
+{
+    image: url(:/images/Participation display/Red horizontal line.png);
+}
+
+ChartsAndCamerasWnd QLabel#BlueHorizontalLine
+{
+    image: url(:/images/Participation display/Blue horizontal line.png);
+}
+
+ChartsAndCamerasWnd QLabel#BlueVerticalBar
+{
+    image: url(:/images/Participation display/Blue vertical bars.png);
+}
+
+ChartsAndCamerasWnd QLabel#GreenVerticalBar
+{
+    image: url(:/images/Participation display/Green vertical bars.png);
+}
+
+ChartsAndCamerasWnd QLabel#PurpleVerticalBar
+{
+    image: url(:/images/Participation display/Purple vertical bars.png);
+}

+ 128 - 0
gen_interface.cpp

@@ -0,0 +1,128 @@
+#include "gen_interface.h"
+QJsonObject Gen_Interface::getInfofromDb(){
+    QJsonObject data;
+    QJsonArray fieldsArray;
+    QSqlDatabase db = QSqlDatabase::database();
+    if (!db.isOpen()) {
+        qWarning() << "数据库未打开";
+        return data;
+    }
+
+    // 查询 systemConfig 表
+    QSqlQuery queryBond(db);
+    queryBond.prepare(R"(
+        SELECT Function, Description,setValue
+        FROM systemConfig
+    )");
+    if (queryBond.exec()) {
+        while (queryBond.next()) {
+            QJsonObject field;
+            field["Function"] = queryBond.value("Function").toString();
+            field["Description"] = queryBond.value("Description").toString();
+            field["setValue"] = queryBond.value("setValue").toInt();
+            fieldsArray.append(field);
+        }
+
+
+        // qDebug() << "Fetched fields:" << fieldsArray;
+    } else {
+        qWarning() << "查询 systemConfig 失败:" << queryBond.lastError().text();
+    }
+    data["systemConfig"]=fieldsArray;
+    // qDebug() << "Fetched data:" << data;
+    return data;
+
+}
+int Gen_Interface::getLanguageValue(){
+    int data;
+    QJsonArray fieldsArray;
+    QSqlDatabase db = QSqlDatabase::database();
+    if (!db.isOpen()) {
+        qWarning() << "数据库未打开";
+        return -1;
+    }
+
+    // 查询 systemConfig 表
+    QSqlQuery queryBond(db);
+    queryBond.prepare(R"(
+        SELECT Function, Description,setValue
+        FROM systemConfig
+    )");
+    if (queryBond.exec()) {
+        while (queryBond.next()) {
+            QJsonObject field;
+
+            field["Function"] = queryBond.value("Function").toString();
+            if(field["Function"] == "language"){
+                data = queryBond.value("setValue").toInt();
+                return data;
+            }
+        }
+
+
+        // qDebug() << "Fetched fields:" << fieldsArray;
+    } else {
+        qWarning() << "查询 systemConfig 失败:" << queryBond.lastError().text();
+    }
+    return -1;
+
+}
+int Gen_Interface::getThemeValue(){
+    int data;
+    QJsonArray fieldsArray;
+    QSqlDatabase db = QSqlDatabase::database();
+    if (!db.isOpen()) {
+        qWarning() << "数据库未打开";
+        return -1;
+    }
+
+    // 查询 systemConfig 表
+    QSqlQuery queryBond(db);
+    queryBond.prepare(R"(
+        SELECT Function, Description,setValue
+        FROM systemConfig
+    )");
+    if (queryBond.exec()) {
+        while (queryBond.next()) {
+            QJsonObject field;
+
+            field["Function"] = queryBond.value("Function").toString();
+            if(field["Function"] == "theme"){
+                data = queryBond.value("setValue").toInt();
+                return data;
+            }
+        }
+
+
+        // qDebug() << "Fetched fields:" << fieldsArray;
+    } else {
+        qWarning() << "查询 systemConfig 失败:" << queryBond.lastError().text();
+    }
+    return -1;
+}
+void Gen_Interface::setLanguageValue(int data){
+    QSqlDatabase db = QSqlDatabase::database();
+    if (!db.isOpen()) {
+        qWarning() << "数据库未打开";
+    }
+    QString sql = QString("UPDATE systemConfig SET setValue = '%1' WHERE Function = 'language'").arg(data);
+    QSqlQuery query;
+    if (query.exec(sql)) {
+        qDebug() << "Update successful";
+    } else {
+        qDebug() << "Update failed:" << query.lastError().text();
+    }
+}
+void Gen_Interface::setThemeValue(int data){
+    QSqlDatabase db = QSqlDatabase::database();
+    if (!db.isOpen()) {
+        qWarning() << "数据库未打开";
+    }
+    QString sql = QString("UPDATE systemConfig SET setValue = '%1' WHERE Function = 'theme'").arg(data);
+    QSqlQuery query;
+    if (query.exec(sql)) {
+        qDebug() << "Update successful";
+    } else {
+        qDebug() << "Update failed:" << query.lastError().text();
+    }
+}

+ 20 - 0
gen_interface.h

@@ -0,0 +1,20 @@
+#pragma once
+#ifndef GEN_INTERFACE_H
+#define GEN_INTERFACE_H
+#include <QJsonObject>
+#include <QtSql>
+#include <QSqlDatabase>
+#include <QSqlQuery>
+#include <QSqlError>
+#endif // GEN_INTERFACE_H
+class Gen_Interface{
+
+public:
+    //从数据库中获取systemconfig表中的信息
+    QJsonObject getInfofromDb();
+    int getLanguageValue();
+    int getThemeValue();
+    void setLanguageValue(int data);
+    void setThemeValue(int data);
+
+};

BIN
images/check_selected.png


BIN
images/home_left_hide.png


BIN
images/home_right_show.png


+ 32 - 2
main.cpp

@@ -1,11 +1,41 @@
+#pragma once
 #include "MainWnd.h"
-
+#include "OriginalWnd/OriginalWnd.h"
 #include <QApplication>
 #include <QFile>
-
+#include <QSqlDatabase>
+#include <QSqlError>
+#include <QDebug>
+#include <QDir>
 int main(int argc, char *argv[])
 {
     QApplication a(argc, argv);
+    // 获取构建目录路径
+    QString buildDirPath = QCoreApplication::applicationDirPath();
+    QDir buildDirectory(buildDirPath);
+
+    qDebug() << "构建目录路径:" << buildDirPath;
+    // 构造目标数据库文件路径
+    QString destDbPath = buildDirectory.filePath("configurations.db");
+    qDebug() << "目标数据库路径:" << destDbPath;
+
+    // 检查文件是否存在
+    QFile databaseFile(destDbPath);
+    if (!databaseFile.exists()) {
+        qDebug() << "数据库文件不存在:" << destDbPath;
+        return -1;
+    }
+
+    // 创建数据库连接
+    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
+    db.setDatabaseName(destDbPath);
+
+    if (!db.open()) {
+        qDebug() << "数据库打开失败:" << db.lastError().text();
+        return -1;
+    } else {
+        qDebug() << "数据库加载成功!";
+    }
 
     QFile qssFile(":/light.qss");
     if(qssFile.open(QFile::ReadOnly)){

+ 3 - 8
res.qrc

@@ -46,7 +46,6 @@
         <file>images/home_openFile.png</file>
         <file>images/home_right.png</file>
         <file>images/home_up.png</file>
-        <file>config/Home_config.json</file>
         <file>images/home_add.png</file>
         <file>images/home_minus.png</file>
         <file>images/light/ruler.png</file>
@@ -75,13 +74,6 @@
         <file>images/Participation display/RedDiamond.png</file>
         <file>images/Participation display/White vertical bars.png</file>
         <file>images/Participation display/YellowDiamond.png</file>
-        <file>config/Diagnosis_config.json</file>
-        <file>config/Disposition_config.json</file>
-        <file>config/Home_config.json</file>
-        <file>config/Module_config.json</file>
-        <file>config/Production_config.json</file>
-        <file>config/Program_config.json</file>
-        <file>config/System_config.json</file>
         <file>images/check_selected.png</file>
         <file>images/three_Selecte.png</file>
         <file>images/drop.png</file>
@@ -94,5 +86,8 @@
         <file>images/TopStatusBar/HostStatus.png</file>
         <file>images/TopStatusBar/MachineLink.png</file>
         <file>images/TopStatusBar/user.png</file>
+        <file>dark.qss</file>
+        <file>images/home_left_hide.png</file>
+        <file>images/home_right_show.png</file>
     </qresource>
 </RCC>