#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 #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(); void loadButtonConfigForThirdLevel(const QJsonObject &thirdLevelObj); //加载并显示三级目录的按钮配置信息 QModelIndex findLastVisibleChild(const QModelIndex &parentIndex); // 分割线 找到最后一个可见子项 void loadJsonFromFile(const QString &filePath); //加载 JSON 数据 void loadTreeData(const QJsonDocument &doc); //初始化树视图 void applyCustomStyles(); //目录树样式 void updateNavigationBar(const QModelIndex &index); //更新导航栏内容,根据点击的目录项动态显示 void paintAllBranches(const QModelIndex &parentIndex, QPainter &painter); //在“父节点 -> 子节点”间画垂直线 void drawParentChildLine(const QModelIndex &childIndex, QPainter &painter); //在“父节点 -> 子节点”间画一条“L”型拐角线,仅调整横向线段的长度 void drawSiblingLine(const QModelIndex &childIndex, QPainter &painter); //若本节点下面还有兄弟,则在拐点列那里继续往下画竖线 void preloadAllConfigs(const QStringList &configPaths);// 加载多个配置文件到内存 void switchConfig(const QString &configKey); void loadJsonDoc(const QJsonDocument &doc, const QString &configFilePath); // 直接传递 QJsonDocument 进行加载 void clearThirdLevelMenu(); //清理并隐藏三级目录菜单内容 private: QWidget *widget2; // 父组件,用于确定导航栏位置 QTreeView *treeViewDown; // 完整目录树 OriginalWnd *m_originalWnd; // 声明指向 OriginalWnd 的指针 QStandardItemModel *downModel; // 树状结构模型 QWidget *navigationWidget; // 动态导航栏窗口 QVBoxLayout *navigationLayout; // 导航栏布局 bool m_blockItemChanged; // 防止递归触发信号 void updateChildItems(QStandardItem *parentItem, Qt::CheckState state); // 更新所有子项的复选框状态 void updateParentItems(QStandardItem *parentItem); // 更新所有父项的复选框状态 QSet checkedPaths; // 记录被选中的复选框路径 QString currentConfigFilePath; // 新增:当前配置文件路径 // 用于缓存所有配置文件 JSON QMap m_configCache; void clearAllSeparators(); QString currentConfigKey(const QString &configFilePath); QStringList collectCheckedPathsRecursive(QStandardItem *item = nullptr, QStringList path = QStringList()); // 收集所有被选中的复选框路径 QStandardItem* findFirstThirdLevelItemDFS(QStandardItem *parentItem); void setCheckedPaths(const QStringList &checkedPaths); // 根据路径设置复选框状态 QStringList collectCheckedPaths(); //aa void saveCheckedPaths(); //保存复选框状态 void loadCheckedPaths(); //加载复选框状态 QPushButton *buttonOpenFile; // 返回一级菜单 QPushButton *buttonUp; // 遍历导航向上 QPushButton *buttonDown; // 遍历导航向下 QPushButton *buttonLeft; // 进入下一级目录 QPushButton *buttonRight; // 返回上一级目录 QJsonDocument m_jsonDoc; // 存储已加载的 JSON 文档 QSet visitedPaths; // 用于存储选中路径 QSet expandedPaths; // 用于存储选中展开路径 bool restoring; // 标识当前是否处于“恢复”状态 QFrame* createUnifiedSeparator(QWidget *parent, int height = 1); //创建横线样式 void updateSeparatorLine(); // 目录树的横线 QMap firstLevelSeparators; // 遍历记录的一级目录 void saveVisitedPaths(); //保存当前选中与展开路径到 QSettings void loadVisitedPaths(); //从 QSettings 中加载上一次的选中与展开路径 void addVisitedPath(const QStringList &path); //将某条选中路径添加到 visitedPaths void removeVisitedPath(const QStringList &path); //将某条选中路径从 visitedPaths 中移除 void addExpandedPath(const QStringList &path); //将某条展开路径添加到 expandedPaths void removeExpandedPath(const QStringList &path); //将某条展开路径从 expandedPaths 中移除 QStringList buildItemPath(QStandardItem *item); //构建给定 QStandardItem 的路径,如 "一级/二级/三级" QModelIndex findItemByPath(const QStringList &path); //根据路径查找对应的 QModelIndex void storeExpandedItems(QStandardItem *parentItem, const QStringList ¤tPath, QStringList &expandedPaths); //各个节点间遍历最终输出的所有展开路径 QModelIndex findItemByPathRecursive(QStandardItem *parentItem, const QStringList &path, int depth); //根据分段路径依次往下层匹配 QModelIndex getNextIndex(const QModelIndex ¤tIndex); //获取当前索引的下一个有效索引 QModelIndex getLastChildIndex(const QModelIndex &parentIndex); //获取最后一个子节点的索引 void setupButton(); // 创建并初始化按钮 void buildTree(const QJsonObject &jsonObj, QStandardItem *parent); //构建目录树 void displayThirdLevelFields(const QJsonObject &fields); //显示三级目录的字段内容(打开新窗口) void updateNavigationWidgetGeometry(); //更新导航栏窗口的位置 protected: bool eventFilter(QObject *watched, QEvent *event) override; //拦截 Paint 事件 private slots: void onItemChanged(QStandardItem *item); //处理复选框状态的变化 void onButtonOpenFileClicked(); // 槽函数:返回一级菜单 void onButtonUpClicked(); // 槽函数:遍历导航向上 void onButtonDownClicked(); // 槽函数:遍历导航向下 void onButtonLeftClicked(); // 槽函数:进入下一级目录 void onButtonRightClicked(); // 槽函数:返回上一级目录 }; #endif // TREEVIEWMANAGER_H