#ifndef TREEVIEWMANAGER_H #define TREEVIEWMANAGER_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class OriginalWnd; // 前向声明 class TreeViewManager : public QWidget { Q_OBJECT public: /** * @brief 构造函数 * @param parent 父窗口 * @param downView 完整目录树的视图 * @param widget2 父组件,用于确定导航栏位置 * @param horizontalLayout2 用于计算导航栏宽度 */ explicit TreeViewManager(OriginalWnd* originalWnd, QWidget *widget2, QWidget *parent = nullptr); virtual ~TreeViewManager(); /** * @brief 加载并显示三级目录的按钮配置信息 * @param thirdLevelObj 三级目录的 JSON 对象 */ void loadButtonConfigForThirdLevel(const QJsonObject &thirdLevelObj); /** * @brief 加载 JSON 数据并初始化树视图 * @param filePath JSON 文件路径 */ void loadJsonFromFile(const QString &filePath); void loadTreeData(const QJsonDocument &doc); void applyCustomStyles(); /** * @brief 更新导航栏内容,根据点击的目录项动态显示 * @param index 点击的目录项索引 */ void updateNavigationBar(const QModelIndex &index); //导航栏更新 void paintAllBranches(const QModelIndex &parentIndex, QPainter &painter); //在“父节点 -> 子节点”间画一条“L”型拐角线,仅调整横向线段的长度 void drawParentChildLine(const QModelIndex &childIndex, QPainter &painter); void drawSiblingLine(const QModelIndex &childIndex, QPainter &painter); private: QWidget *widget2; // 父组件,用于确定导航栏位置 QTreeView *treeViewDown; // 完整目录树 OriginalWnd *m_originalWnd; // 声明指向 OriginalWnd 的指针 QStandardItemModel *downModel; // 树状结构模型 QWidget *navigationWidget; // 动态导航栏窗口 QVBoxLayout *navigationLayout; // 导航栏布局 QPushButton *buttonOpenFile; // 返回一级菜单 QPushButton *buttonUp; // 遍历导航向上 QPushButton *buttonDown; // 遍历导航向下 QPushButton *buttonLeft; // 进入下一级目录 QPushButton *buttonRight; // 返回上一级目录 QJsonDocument m_jsonDoc; // 存储已加载的 JSON 文档 // 用于存储选中路径和展开路径 QSet visitedPaths; QSet expandedPaths; bool restoring; // 标识当前是否处于“恢复”状态 /** * @brief 保存当前选中与展开路径到 QSettings */ void saveVisitedPaths(); /** * @brief 从 QSettings 中加载上一次的选中与展开路径 */ void loadVisitedPaths(); /** * @brief 将某条选中路径添加到 visitedPaths * @param path 要记录的路径(分段组成) */ void addVisitedPath(const QStringList &path); /** * @brief 将某条选中路径从 visitedPaths 中移除 * @param path 要移除的路径(分段组成) */ void removeVisitedPath(const QStringList &path); /** * @brief 将某条展开路径添加到 expandedPaths * @param path 要记录的路径(分段组成) */ void addExpandedPath(const QStringList &path); /** * @brief 将某条展开路径从 expandedPaths 中移除 * @param path 要移除的路径(分段组成) */ void removeExpandedPath(const QStringList &path); /** * @brief 构建给定 QStandardItem 的路径,如 "一级/二级/三级" * @param item 要处理的节点 * @return 分段组成的路径 */ QStringList buildItemPath(QStandardItem *item); /** * @brief 根据路径查找对应的 QModelIndex * @param path 分段路径,如 {"一级目录","二级目录"} * @return 若找到,返回有效的 QModelIndex,否则返回无效 */ QModelIndex findItemByPath(const QStringList &path); /** * @brief 递归存储展开状态,可根据需要在各个节点间遍历 * @param parentItem 父节点 * @param currentPath 当前节点路径 * @param expandedPaths 最终输出的所有展开路径 */ void storeExpandedItems(QStandardItem *parentItem, const QStringList ¤tPath, QStringList &expandedPaths); /** * @brief 递归查找节点:根据分段路径依次往下层匹配 * @param parentItem 父节点 * @param path 分段路径 * @param depth 当前递归深度 * @return 匹配到则返回有效 QModelIndex,否则返回无效 */ QModelIndex findItemByPathRecursive(QStandardItem *parentItem, const QStringList &path, int depth); /** * @brief 获取当前索引的下一个有效索引 * @param currentIndex 当前索引 * @return 下一个索引,如无则返回无效 */ QModelIndex getNextIndex(const QModelIndex ¤tIndex); /** * @brief 获取最后一个子节点的索引 * @param parentIndex 父节点索引 * @return 若有子节点,则返回最后一个子节点,否则无效 */ QModelIndex getLastChildIndex(const QModelIndex &parentIndex); void setupButton(); // 创建并初始化按钮 /** * @brief 构建目录树 * @param jsonObj JSON 数据对象 * @param parent 父节点 */ void buildTree(const QJsonObject &jsonObj, QStandardItem *parent); /** * @brief 显示三级目录的字段内容(打开新窗口) * @param fields 字段数据 */ void displayThirdLevelFields(const QJsonObject &fields); /** * @brief 更新导航栏窗口的几何位置 */ void updateNavigationWidgetGeometry(); protected: bool eventFilter(QObject *watched, QEvent *event) override; private slots: void onButtonOpenFileClicked(); // 槽函数:返回一级菜单 void onButtonUpClicked(); // 槽函数:遍历导航向上 void onButtonDownClicked(); // 槽函数:遍历导航向下 void onButtonLeftClicked(); // 槽函数:进入下一级目录 void onButtonRightClicked(); // 槽函数:返回上一级目录 }; #endif // TREEVIEWMANAGER_H