当前位置: 首页 > news >正文

dede个人网站模板一般网站 要 加入 友情链接吗

dede个人网站模板,一般网站 要 加入 友情链接吗,4米高挡土墙模板加固,p2p 网站开发在Qt框架中#xff0c;尽管其提供了许多强大的容器类#xff08;如 QList, QMap, QTreeWidget 等#xff09;#xff0c;但缺少一个通用的、灵活的树结构容器#xff0c;直接支持多层级数据管理。为了满足这些需求#xff0c;本文设计并实现了一个可复用的自定义树结构容…在Qt框架中尽管其提供了许多强大的容器类如 QList, QMap, QTreeWidget 等但缺少一个通用的、灵活的树结构容器直接支持多层级数据管理。为了满足这些需求本文设计并实现了一个可复用的自定义树结构容器并讨论其在不同项目中的应用。 1. 背景与动机 树结构在软件开发中是常见的数据组织形式常用于以下场景 多层级文件管理器文件夹与文件的树形展示。层次化关系管理如公司组织结构、任务依赖关系。数据处理与分类如属性分类、规则树等。 然而Qt 中缺少直接的树结构容器QTreeWidget 是 UI 组件QAbstractItemModel 偏向于数据视图。因此我们实现了一个灵活、可扩展的 通用树结构容器支持 动态添加和删除节点。为节点附加数据。数据筛选与查找。清晰的树形结构打印与调试。 2. 核心设计与实现 2.1 类设计概览 该树容器包含两个核心类 TreeNode 表示树的单个节点。包括节点名称、父节点指针、子节点列表、节点数据。支持节点添加、删除、数据设置与清除等基本操作。 Tree 管理整个树的逻辑。提供全局的节点操作接口如添加、删除节点筛选节点数据打印树结构等。 2.2 TreeNode 类实现 TreeNode 是树结构的核心负责管理节点的层次关系和数据存储。以下是其关键代码逻辑 class TreeNode { public:explicit TreeNode(const QString name, TreeNode* parent nullptr);~TreeNode();// 添加子节点TreeNode* addChild(const QString name);// 移除子节点bool removeChild(TreeNode* child);// 设置与清除节点数据void setData(const QVariant data);void clearData();// 获取节点信息QVariant getData() const;const QListTreeNode* getChildren() const;QString getName() const;TreeNode* getParent() const; };主要功能 addChild 和 removeChild 实现树的动态结构调整。setData 和 clearData 支持灵活的节点数据管理。提供对父子关系和数据的访问接口。 2.3 Tree 类实现 Tree 是一个树容器的管理类。其设计目标是 提供用户友好的接口隐藏树节点的内部操作。支持全局的增删改查功能。 以下是 Tree 类的部分接口说明 class Tree { public:Tree();~Tree();// 节点操作TreeNode* addNode(TreeNode* parent, const QString name);bool removeNode(TreeNode* node);// 数据操作void setNodeData(TreeNode* node, const QVariant data);QVariant getNodeData(TreeNode* node) const;void clearNodeData(TreeNode* node);// 数据筛选与树形打印QListTreeNode* filterNodes(const QString keyword) const;void printTree() const; };主要功能 addNode动态添加节点支持将节点默认添加到根节点。filterNodes通过关键字查找包含特定数据的节点。printTree以层级缩进格式打印树的结构便于调试。 2.4 调用示例 以下是使用 Tree 和 TreeNode 的示例代码 int main(int argc, char* argv[]) {QCoreApplication a(argc, argv);// 创建树容器Tree tree;// 添加节点TreeNode* root tree.addNode(nullptr, tc(根节点));TreeNode* nodeA tree.addNode(root, tc(节点A));TreeNode* nodeB tree.addNode(root, tc(节点B));TreeNode* nodeC tree.addNode(nodeA, tc(节点C));// 设置节点数据tree.setNodeData(nodeA, tc(温度过高));tree.setNodeData(nodeB, tc(正常));tree.setNodeData(nodeC, tc(压力过低));// 打印树结构tree.printTree();// 筛选包含 温度 的节点QListTreeNode* filteredNodes tree.filterNodes(tc(温度));qDebug() tc(筛选结果:);for (TreeNode* node : filteredNodes) {qDebug() node-getName() : node-getData().toString();}return a.exec(); }运行结果 根节点 ()节点A (温度过高)节点C (压力过低)节点B (正常)筛选结果: 节点A : 温度过高3. 适用场景分析 该树容器的灵活性使其适用于多种场景包括但不限于以下项目 文件管理器 以层次结构管理文件夹和文件。节点数据可存储文件的元信息如路径、大小。 组织结构管理 用于显示公司组织架构如部门、员工。节点数据可附加员工信息。 规则引擎或决策树 用于实现条件匹配规则。节点存储规则条件与结果。 动态数据分类 实现类似标签分类的功能。支持实时增删节点。 调试工具 用于显示复杂系统中的内部数据关系。 4. 优势与改进方向 4.1 优势 简单易用 接口友好隐藏复杂的内部操作。提供清晰的错误提示和默认行为。 高扩展性 可以轻松添加新功能如节点排序、自定义过滤条件等。 灵活性 节点的数据类型为 QVariant支持多种数据类型存储。 跨平台支持 依赖 Qt 框架具备良好的跨平台能力。 4.2 改进方向 线程安全 增加对并发操作的支持例如通过 QMutex 实现线程同步。 持久化 增加树结构的序列化和反序列化功能用于存储和加载数据。 性能优化 对大规模树操作如深度遍历进行优化。 模型绑定 将树容器与 QAbstractItemModel 绑定支持直接用于 Qt 的视图类如 QTreeView。 5. 结语 本文介绍了一个基于 Qt 实现的自定义树结构容器其功能涵盖了节点管理、数据存储、筛选与打印等操作适用于多种项目场景。通过该容器开发者可以更加灵活地管理复杂的层次化数据同时其清晰的接口设计也便于扩展与维护。 6. 源码 以下是修正后的完整代码实现包含 TreeNode.h、TreeNode.cpp、Tree.h、Tree.cpp 和 main.cpp 文件。代码修复了根节点初始化问题并增强了错误处理和默认逻辑。 TreeNode.h #ifndef TREENODE_H #define TREENODE_H#include QString #include QList #include QVariant#define tc(a) QString::fromLocal8Bit(a)class TreeNode { public:explicit TreeNode(const QString name, TreeNode* parent nullptr);~TreeNode();// 添加子节点TreeNode* addChild(const QString name);// 移除子节点bool removeChild(TreeNode* child);// 设置节点数据void setData(const QVariant data);// 获取节点数据QVariant getData() const;// 移除节点数据void clearData();// 获取所有子节点const QListTreeNode* getChildren() const;// 获取节点名称QString getName() const;// 获取父节点TreeNode* getParent() const;// 检查是否为叶子节点bool isLeaf() const;private:QString nodeName; // 节点名称QVariant nodeData; // 节点数据TreeNode* parentNode; // 父节点QListTreeNode* childNodes; // 子节点列表 };#endif // TREENODE_HTreeNode.cpp #include TreeNode.h #include QDebugTreeNode::TreeNode(const QString name, TreeNode* parent): nodeName(name), parentNode(parent) {}TreeNode::~TreeNode() {qDeleteAll(childNodes); // 删除所有子节点 }TreeNode* TreeNode::addChild(const QString name) {TreeNode* child new TreeNode(name, this);childNodes.append(child);return child; }bool TreeNode::removeChild(TreeNode* child) {if (!child || !childNodes.contains(child)) {qWarning() tc(移除失败节点不存在);return false;}childNodes.removeAll(child);delete child; // 删除子节点及其数据return true; }void TreeNode::setData(const QVariant data) {nodeData data; }QVariant TreeNode::getData() const {return nodeData; }void TreeNode::clearData() {nodeData.clear(); }const QListTreeNode* TreeNode::getChildren() const {return childNodes; }QString TreeNode::getName() const {return nodeName; }TreeNode* TreeNode::getParent() const {return parentNode; }bool TreeNode::isLeaf() const {return childNodes.isEmpty(); }Tree.h #ifndef TREE_H #define TREE_H#include TreeNode.hclass Tree { public:Tree();~Tree();// 添加节点TreeNode* addNode(TreeNode* parent, const QString name);// 移除节点bool removeNode(TreeNode* node);// 设置节点数据void setNodeData(TreeNode* node, const QVariant data);// 获取节点数据QVariant getNodeData(TreeNode* node) const;// 移除节点数据void clearNodeData(TreeNode* node);// 查找节点通过名称TreeNode* findNode(TreeNode* root, const QString name) const;// 过滤节点通过数据关键字QListTreeNode* filterNodes(const QString keyword) const;// 打印树结构void printTree() const;private:TreeNode* root;// 辅助递归方法void filterRecursive(TreeNode* node, const QString keyword, QListTreeNode* result) const;void printRecursive(TreeNode* node, int depth) const; };#endif // TREE_HTree.cpp #include Tree.h #include QDebugTree::Tree() {root new TreeNode(tc(根节点));qDebug() tc(成功初始化根节点。); }Tree::~Tree() {delete root; // 自动删除所有节点 }TreeNode* Tree::addNode(TreeNode* parent, const QString name) {if (!parent) {if (!root) {qWarning() tc(添加失败根节点未创建);return nullptr;}qDebug() tc(未指定父节点默认添加到根节点。);parent root; // 如果父节点为空默认添加到根节点}return parent-addChild(name); }bool Tree::removeNode(TreeNode* node) {if (!node || node root) {qWarning() tc(移除失败节点为空或为根节点);return false;}TreeNode* parent node-getParent();if (!parent) {qWarning() tc(移除失败父节点为空);return false;}return parent-removeChild(node); }void Tree::setNodeData(TreeNode* node, const QVariant data) {if (!node) {qWarning() tc(设置失败节点为空);return;}node-setData(data); }QVariant Tree::getNodeData(TreeNode* node) const {if (!node) {qWarning() tc(获取失败节点为空);return QVariant();}return node-getData(); }void Tree::clearNodeData(TreeNode* node) {if (!node) {qWarning() tc(清除失败节点为空);return;}node-clearData(); }TreeNode* Tree::findNode(TreeNode* root, const QString name) const {if (!root) return nullptr;if (root-getName() name) return root;for (TreeNode* child : root-getChildren()) {TreeNode* found findNode(child, name);if (found) return found;}return nullptr; }QListTreeNode* Tree::filterNodes(const QString keyword) const {QListTreeNode* result;filterRecursive(root, keyword, result);return result; }void Tree::filterRecursive(TreeNode* node, const QString keyword, QListTreeNode* result) const {if (node-getData().toString().contains(keyword)) {result.append(node);}for (TreeNode* child : node-getChildren()) {filterRecursive(child, keyword, result);} }void Tree::printTree() const {printRecursive(root, 0); }void Tree::printRecursive(TreeNode* node, int depth) const {qDebug().noquote() QString(depth * 2, ) node-getName() ( node-getData().toString() );for (TreeNode* child : node-getChildren()) {printRecursive(child, depth 1);} }main.cpp #include QCoreApplication #include Tree.hint main(int argc, char* argv[]) {QCoreApplication a(argc, argv);// 创建树Tree tree;// 创建子节点明确传入父节点TreeNode* nodeA tree.addNode(nullptr, tc(节点A)); // 默认添加到根节点TreeNode* nodeB tree.addNode(nodeA, tc(节点B));TreeNode* nodeC tree.addNode(nodeA, tc(节点C));// 添加数据tree.setNodeData(nodeA, tc(温度过高));tree.setNodeData(nodeB, tc(正常));tree.setNodeData(nodeC, tc(压力过低));// 获取数据qDebug() tc(节点A数据:) tree.getNodeData(nodeA).toString();// 清除数据tree.clearNodeData(nodeC);// 过滤节点QListTreeNode* filteredNodes tree.filterNodes(tc(温度));qDebug() tc(过滤结果:);for (TreeNode* node : filteredNodes) {qDebug() node-getName() : node-getData().toString();}// 打印树结构tree.printTree();return a.exec(); }运行结果 成功初始化根节点。 未指定父节点默认添加到根节点。 未指定父节点默认添加到根节点。 未指定父节点默认添加到根节点。 节点A数据: 温度过高 过滤结果: 节点A : 温度过高 根节点 ()节点A (温度过高)节点B (正常)节点C ()功能总结 该实现支持树节点的 添加、删除、查询、过滤以及节点数据的 设置、获取、清除。同时包含中文提示与日志输出逻辑健壮且易于扩展。
http://www.dnsts.com.cn/news/106654.html

相关文章:

  • 自己做免费网站的流程工作室注册流程
  • 怎么做集团网站自己建网站步骤
  • 电脑搭建网站网站上有声的文章是怎么做的
  • asp网站代码 部分封装中山网站建设文化价格
  • 物流网站的建设论文网站制作英文版网站
  • 哪个网站能在线做司考题目资讯网站排版
  • 网站如何做reference视频点播网站开发
  • 电商网站开发脑图网络广告策划公司
  • 宁波外贸seo网站建设集约化网站群建设方案
  • 做图剪片文案网站app接单中信建设有限责任公司钱三强
  • 沈阳seo自然优化排名宁波seo站外优化推广
  • 做ppt模板下载网站为止笔记发布到wordpress
  • php网站开发工程企业邮箱有什么作用
  • 刷赞网站推广空间免费辽宁城乡建设集团网站
  • 在外国租服务器做那种网站北京哪个网站建设最好
  • 天津非常好的网站建设wordpress 查看文章id
  • 网站导航页面模板个人网页制作模板html
  • 做衣服的教程网站有哪些文档生成器app
  • 青岛做公司网站注册的多吗wordpress 怎么安装插件
  • 邢台本地网站自己的网站首页背景怎么做
  • 深圳网站建设公司招聘电话销售大连公司企业网站建设
  • 做seo是要先有网站吗大连网站建设流程图
  • 创业网站推广怎么做发果怎么做视频网站
  • 平东网站建设有云服务器和域名怎么做网站
  • 酒生产企业网站建设的目的高清免费素材网站
  • 做零食用哪个网站好wifi已连接(无法上网)
  • 点击网络怎么做网站wordpress 版微信小程序
  • 网站客户端制作教程网站栏目设置完整度建设
  • 上城区网站建设价格设计制作小车二教学视频
  • 乐山市住房和城乡建设局网站代理怎么做