treeviewmanager.h 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. #ifndef TREEVIEWMANAGER_H
  2. #define TREEVIEWMANAGER_H
  3. #include <QWidget>
  4. #include <QTreeView>
  5. #include <QJsonObject>
  6. #include <QStandardItemModel>
  7. #include <QMap>
  8. #include <QCheckBox>
  9. #include <QJsonDocument>
  10. #include <QJsonArray>
  11. #include <QFile>
  12. #include <QVBoxLayout>
  13. #include <QLabel>
  14. #include <QLineEdit>
  15. #include <QComboBox>
  16. #include <QRadioButton>
  17. #include <QButtonGroup>
  18. #include <QDebug>
  19. #include <QPushButton>
  20. #include <QStyleFactory>
  21. #include <QTimer>
  22. #include <QPainter>
  23. #include <QEvent>
  24. #include <QStringList>
  25. #include <QSettings>
  26. #include <QSet>
  27. #include <QVariant>
  28. #include <QMenu>
  29. #include <QAction>
  30. #include <QMessageBox>
  31. #include <QTimeEdit>
  32. #include <QHBoxLayout>
  33. #include <QCursor>
  34. #include <QScrollArea>
  35. #include <QToolButton>
  36. #include <QFileInfo>
  37. class OriginalWnd; // 前向声明
  38. class TreeViewManager : public QWidget
  39. {
  40. Q_OBJECT
  41. public:
  42. /**
  43. * @brief 构造函数
  44. * @param parent 父窗口
  45. * @param downView 完整目录树的视图
  46. * @param widget2 父组件,用于确定导航栏位置
  47. * @param horizontalLayout2 用于计算导航栏宽度
  48. */
  49. explicit TreeViewManager(OriginalWnd* originalWnd, QWidget *widget2, QWidget *parent = nullptr);
  50. virtual ~TreeViewManager();
  51. void loadButtonConfigForThirdLevel(const QJsonObject &thirdLevelObj); //加载并显示三级目录的按钮配置信息
  52. QModelIndex findLastVisibleChild(const QModelIndex &parentIndex); // 分割线 找到最后一个可见子项
  53. void loadJsonFromFile(const QString &filePath); //加载 JSON 数据
  54. void loadTreeData(const QJsonDocument &doc); //初始化树视图
  55. void applyCustomStyles(); //目录树样式
  56. void updateNavigationBar(const QModelIndex &index); //更新导航栏内容,根据点击的目录项动态显示
  57. void paintAllBranches(const QModelIndex &parentIndex, QPainter &painter); //在“父节点 -> 子节点”间画垂直线
  58. void drawParentChildLine(const QModelIndex &childIndex, QPainter &painter); //在“父节点 -> 子节点”间画一条“L”型拐角线,仅调整横向线段的长度
  59. void drawSiblingLine(const QModelIndex &childIndex, QPainter &painter); //若本节点下面还有兄弟,则在拐点列那里继续往下画竖线
  60. void preloadAllConfigs(const QStringList &configPaths);// 加载多个配置文件到内存
  61. void switchConfig(const QString &configKey);
  62. void loadJsonDoc(const QJsonDocument &doc, const QString &configFilePath); // 直接传递 QJsonDocument 进行加载
  63. void clearThirdLevelMenu(); //清理并隐藏三级目录菜单内容
  64. private:
  65. QWidget *widget2; // 父组件,用于确定导航栏位置
  66. QTreeView *treeViewDown; // 完整目录树
  67. OriginalWnd *m_originalWnd; // 声明指向 OriginalWnd 的指针
  68. QStandardItemModel *downModel; // 树状结构模型
  69. QWidget *navigationWidget; // 动态导航栏窗口
  70. QVBoxLayout *navigationLayout; // 导航栏布局
  71. bool m_blockItemChanged; // 防止递归触发信号
  72. void updateChildItems(QStandardItem *parentItem, Qt::CheckState state); // 更新所有子项的复选框状态
  73. void updateParentItems(QStandardItem *parentItem); // 更新所有父项的复选框状态
  74. QSet<QString> checkedPaths; // 记录被选中的复选框路径
  75. QString currentConfigFilePath; // 新增:当前配置文件路径
  76. // 用于缓存所有配置文件 JSON
  77. QMap<QString, QJsonDocument> m_configCache;
  78. void clearAllSeparators();
  79. QString currentConfigKey(const QString &configFilePath);
  80. QStringList collectCheckedPathsRecursive(QStandardItem *item = nullptr, QStringList path = QStringList()); // 收集所有被选中的复选框路径
  81. QStandardItem* findFirstThirdLevelItemDFS(QStandardItem *parentItem);
  82. void setCheckedPaths(const QStringList &checkedPaths); // 根据路径设置复选框状态
  83. QStringList collectCheckedPaths(); //aa
  84. void saveCheckedPaths(); //保存复选框状态
  85. void loadCheckedPaths(); //加载复选框状态
  86. QPushButton *buttonOpenFile; // 返回一级菜单
  87. QPushButton *buttonUp; // 遍历导航向上
  88. QPushButton *buttonDown; // 遍历导航向下
  89. QPushButton *buttonLeft; // 进入下一级目录
  90. QPushButton *buttonRight; // 返回上一级目录
  91. QJsonDocument m_jsonDoc; // 存储已加载的 JSON 文档
  92. QSet<QString> visitedPaths; // 用于存储选中路径
  93. QSet<QString> expandedPaths; // 用于存储选中展开路径
  94. bool restoring; // 标识当前是否处于“恢复”状态
  95. QFrame* createUnifiedSeparator(QWidget *parent, int height = 1); //创建横线样式
  96. void updateSeparatorLine(); // 目录树的横线
  97. QMap<QStandardItem*, QFrame*> firstLevelSeparators; // 遍历记录的一级目录
  98. void saveVisitedPaths(); //保存当前选中与展开路径到 QSettings
  99. void loadVisitedPaths(); //从 QSettings 中加载上一次的选中与展开路径
  100. void addVisitedPath(const QStringList &path); //将某条选中路径添加到 visitedPaths
  101. void removeVisitedPath(const QStringList &path); //将某条选中路径从 visitedPaths 中移除
  102. void addExpandedPath(const QStringList &path); //将某条展开路径添加到 expandedPaths
  103. void removeExpandedPath(const QStringList &path); //将某条展开路径从 expandedPaths 中移除
  104. QStringList buildItemPath(QStandardItem *item); //构建给定 QStandardItem 的路径,如 "一级/二级/三级"
  105. QModelIndex findItemByPath(const QStringList &path); //根据路径查找对应的 QModelIndex
  106. void storeExpandedItems(QStandardItem *parentItem,
  107. const QStringList &currentPath,
  108. QStringList &expandedPaths); //各个节点间遍历最终输出的所有展开路径
  109. QModelIndex findItemByPathRecursive(QStandardItem *parentItem,
  110. const QStringList &path,
  111. int depth); //根据分段路径依次往下层匹配
  112. QModelIndex getNextIndex(const QModelIndex &currentIndex); //获取当前索引的下一个有效索引
  113. QModelIndex getLastChildIndex(const QModelIndex &parentIndex); //获取最后一个子节点的索引
  114. void setupButton(); // 创建并初始化按钮
  115. void buildTree(const QJsonObject &jsonObj, QStandardItem *parent); //构建目录树
  116. void displayThirdLevelFields(const QJsonObject &fields); //显示三级目录的字段内容(打开新窗口)
  117. void updateNavigationWidgetGeometry(); //更新导航栏窗口的位置
  118. protected:
  119. bool eventFilter(QObject *watched, QEvent *event) override; //拦截 Paint 事件
  120. private slots:
  121. void onItemChanged(QStandardItem *item); //处理复选框状态的变化
  122. void onButtonOpenFileClicked(); // 槽函数:返回一级菜单
  123. void onButtonUpClicked(); // 槽函数:遍历导航向上
  124. void onButtonDownClicked(); // 槽函数:遍历导航向下
  125. void onButtonLeftClicked(); // 槽函数:进入下一级目录
  126. void onButtonRightClicked(); // 槽函数:返回上一级目录
  127. };
  128. #endif // TREEVIEWMANAGER_H