treeviewmanager.h 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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. class OriginalWnd; // 前向声明
  37. class TreeViewManager : public QWidget
  38. {
  39. Q_OBJECT
  40. public:
  41. /**
  42. * @brief 构造函数
  43. * @param parent 父窗口
  44. * @param downView 完整目录树的视图
  45. * @param widget2 父组件,用于确定导航栏位置
  46. * @param horizontalLayout2 用于计算导航栏宽度
  47. */
  48. explicit TreeViewManager(OriginalWnd* originalWnd, QWidget *widget2, QWidget *parent = nullptr);
  49. virtual ~TreeViewManager();
  50. /**
  51. * @brief 加载并显示三级目录的按钮配置信息
  52. * @param thirdLevelObj 三级目录的 JSON 对象
  53. */
  54. void loadButtonConfigForThirdLevel(const QJsonObject &thirdLevelObj);
  55. /**
  56. * @brief 加载 JSON 数据并初始化树视图
  57. * @param filePath JSON 文件路径
  58. */
  59. void loadJsonFromFile(const QString &filePath);
  60. void loadTreeData(const QJsonDocument &doc);
  61. void applyCustomStyles();
  62. /**
  63. * @brief 更新导航栏内容,根据点击的目录项动态显示
  64. * @param index 点击的目录项索引
  65. */
  66. void updateNavigationBar(const QModelIndex &index); //导航栏更新
  67. void paintAllBranches(const QModelIndex &parentIndex, QPainter &painter);
  68. //在“父节点 -> 子节点”间画一条“L”型拐角线,仅调整横向线段的长度
  69. void drawParentChildLine(const QModelIndex &childIndex, QPainter &painter);
  70. void drawSiblingLine(const QModelIndex &childIndex, QPainter &painter);
  71. private:
  72. QWidget *widget2; // 父组件,用于确定导航栏位置
  73. QTreeView *treeViewDown; // 完整目录树
  74. OriginalWnd *m_originalWnd; // 声明指向 OriginalWnd 的指针
  75. QStandardItemModel *downModel; // 树状结构模型
  76. QWidget *navigationWidget; // 动态导航栏窗口
  77. QVBoxLayout *navigationLayout; // 导航栏布局
  78. QPushButton *buttonOpenFile; // 返回一级菜单
  79. QPushButton *buttonUp; // 遍历导航向上
  80. QPushButton *buttonDown; // 遍历导航向下
  81. QPushButton *buttonLeft; // 进入下一级目录
  82. QPushButton *buttonRight; // 返回上一级目录
  83. QJsonDocument m_jsonDoc; // 存储已加载的 JSON 文档
  84. // 用于存储选中路径和展开路径
  85. QSet<QString> visitedPaths;
  86. QSet<QString> expandedPaths;
  87. bool restoring; // 标识当前是否处于“恢复”状态
  88. /**
  89. * @brief 保存当前选中与展开路径到 QSettings
  90. */
  91. void saveVisitedPaths();
  92. /**
  93. * @brief 从 QSettings 中加载上一次的选中与展开路径
  94. */
  95. void loadVisitedPaths();
  96. /**
  97. * @brief 将某条选中路径添加到 visitedPaths
  98. * @param path 要记录的路径(分段组成)
  99. */
  100. void addVisitedPath(const QStringList &path);
  101. /**
  102. * @brief 将某条选中路径从 visitedPaths 中移除
  103. * @param path 要移除的路径(分段组成)
  104. */
  105. void removeVisitedPath(const QStringList &path);
  106. /**
  107. * @brief 将某条展开路径添加到 expandedPaths
  108. * @param path 要记录的路径(分段组成)
  109. */
  110. void addExpandedPath(const QStringList &path);
  111. /**
  112. * @brief 将某条展开路径从 expandedPaths 中移除
  113. * @param path 要移除的路径(分段组成)
  114. */
  115. void removeExpandedPath(const QStringList &path);
  116. /**
  117. * @brief 构建给定 QStandardItem 的路径,如 "一级/二级/三级"
  118. * @param item 要处理的节点
  119. * @return 分段组成的路径
  120. */
  121. QStringList buildItemPath(QStandardItem *item);
  122. /**
  123. * @brief 根据路径查找对应的 QModelIndex
  124. * @param path 分段路径,如 {"一级目录","二级目录"}
  125. * @return 若找到,返回有效的 QModelIndex,否则返回无效
  126. */
  127. QModelIndex findItemByPath(const QStringList &path);
  128. /**
  129. * @brief 递归存储展开状态,可根据需要在各个节点间遍历
  130. * @param parentItem 父节点
  131. * @param currentPath 当前节点路径
  132. * @param expandedPaths 最终输出的所有展开路径
  133. */
  134. void storeExpandedItems(QStandardItem *parentItem,
  135. const QStringList &currentPath,
  136. QStringList &expandedPaths);
  137. /**
  138. * @brief 递归查找节点:根据分段路径依次往下层匹配
  139. * @param parentItem 父节点
  140. * @param path 分段路径
  141. * @param depth 当前递归深度
  142. * @return 匹配到则返回有效 QModelIndex,否则返回无效
  143. */
  144. QModelIndex findItemByPathRecursive(QStandardItem *parentItem,
  145. const QStringList &path,
  146. int depth);
  147. /**
  148. * @brief 获取当前索引的下一个有效索引
  149. * @param currentIndex 当前索引
  150. * @return 下一个索引,如无则返回无效
  151. */
  152. QModelIndex getNextIndex(const QModelIndex &currentIndex);
  153. /**
  154. * @brief 获取最后一个子节点的索引
  155. * @param parentIndex 父节点索引
  156. * @return 若有子节点,则返回最后一个子节点,否则无效
  157. */
  158. QModelIndex getLastChildIndex(const QModelIndex &parentIndex);
  159. void setupButton(); // 创建并初始化按钮
  160. /**
  161. * @brief 构建目录树
  162. * @param jsonObj JSON 数据对象
  163. * @param parent 父节点
  164. */
  165. void buildTree(const QJsonObject &jsonObj, QStandardItem *parent);
  166. /**
  167. * @brief 显示三级目录的字段内容(打开新窗口)
  168. * @param fields 字段数据
  169. */
  170. void displayThirdLevelFields(const QJsonObject &fields);
  171. /**
  172. * @brief 更新导航栏窗口的几何位置
  173. */
  174. void updateNavigationWidgetGeometry();
  175. protected:
  176. bool eventFilter(QObject *watched, QEvent *event) override;
  177. private slots:
  178. void onButtonOpenFileClicked(); // 槽函数:返回一级菜单
  179. void onButtonUpClicked(); // 槽函数:遍历导航向上
  180. void onButtonDownClicked(); // 槽函数:遍历导航向下
  181. void onButtonLeftClicked(); // 槽函数:进入下一级目录
  182. void onButtonRightClicked(); // 槽函数:返回上一级目录
  183. };
  184. #endif // TREEVIEWMANAGER_H