Qt编程:QNodeEditor 工程代码简介

【链接】https://github.com/Qv2ray/QNodeEditor

QNodeEditor 是一个基于 Qt 的节点编辑器框架,用于创建可视化的节点图应用程序。下面将从工程结构和核心组件两个方面进行详细解析。

工程结构

1. 头文件目录 (include/)

头文件目录包含了框架的所有公共接口定义:

核心组件

  • Node.hpp - 节点基础类

  • NodeDataModel.hpp - 节点数据模型抽象接口

  • Connection.hpp - 连接线基础类

  • FlowScene.hpp - 节点场景管理

  • FlowView.hpp - 节点视图组件

数据结构

  • NodeData.hpp - 节点数据基类

  • DataModelRegistry.hpp - 节点数据模型注册表

  • TypeConverter.hpp - 数据类型转换器

图形元素

  • NodeGeometry.hpp - 节点几何计算

  • NodeGraphicsObject.hpp - 节点图形对象

  • ConnectionGeometry.hpp - 连接线几何计算

  • ConnectionGraphicsObject.hpp - 连接线图形对象

样式系统

  • NodeStyle.hpp - 节点样式定义

  • ConnectionStyle.hpp - 连接线样式定义

  • FlowViewStyle.hpp - 视图样式定义

  • Style.hpp - 基础样式定义

  • StyleCollection.hpp - 样式集合管理

辅助功能

  • Serializable.hpp - 序列化接口

  • Compiler.hpp - 编译器相关工具

  • OperatingSystem.hpp - 操作系统相关工具

2. 源文件目录

源文件实现了头文件中定义的接口:

节点相关

  • Node.cpp - 节点实现

  • NodeDataModel.cpp - 节点数据模型基础实现

  • NodeGeometry.cpp - 节点几何计算实现

  • NodeGraphicsObject.cpp - 节点图形对象实现

  • NodePainter.cpp/.hpp - 节点绘制逻辑

  • NodeState.cpp - 节点状态管理

连接线相关

  • Connection.cpp - 连接线实现

  • ConnectionGeometry.cpp - 连接线几何计算

  • ConnectionGraphicsObject.cpp - 连接线图形对象

  • ConnectionPainter.cpp/.hpp - 连接线绘制逻辑

  • ConnectionState.cpp - 连接线状态管理

  • ConnectionStyle.cpp - 连接线样式实现

场景管理

  • FlowScene.cpp - 节点场景实现

  • FlowView.cpp - 节点视图实现

  • NodeConnectionInteraction.cpp/.hpp - 节点与连接线交互逻辑

样式系统

  • StyleCollection.cpp - 样式集合实现

  • NodeStyle.cpp - 节点样式实现

  • FlowViewStyle.cpp - 视图样式实现

其他

  • DataModelRegistry.cpp - 数据模型注册表实现

  • Properties.cpp/.hpp - 属性系统

核心组件详解

1. 节点系统 (Node)

NodeDataModel (抽象基类)

  • 定义节点的数据模型接口

  • 负责:

    • 节点标题/名称

    • 端口定义(数量、类型、连接策略)

    • 数据处理逻辑

    • 嵌入式小部件

    • 序列化/反序列化

Node 类

  • 组合了:

    • NodeGraphicsObject (图形表示)

    • NodeGeometry (几何计算)

    • NodeDataModel (数据模型)

    • NodeState (状态管理)

  • 负责节点在场景中的生命周期

NodeGraphicsObject

  • 继承自 QGraphicsObject

  • 处理:

    • 鼠标事件(拖动、选择等)

    • 绘制请求转发

    • 位置变化通知

NodeGeometry

  • 计算:

    • 节点尺寸

    • 端口位置

    • 标题区域

    • 小部件区域

2. 连接系统 (Connection)

Connection 类

  • 组合了:

    • ConnectionGraphicsObject (图形表示)

    • ConnectionGeometry (几何计算)

    • ConnectionState (状态管理)

  • 管理两个端口间的数据流

ConnectionGraphicsObject

  • 继承自 QGraphicsObject

  • 处理:

    • 鼠标交互

    • 绘制请求

    • 位置更新

ConnectionGeometry

  • 计算:

    • 控制点(用于贝塞尔曲线)

    • 边界框

    • 与端口的交点

3. 场景管理 (FlowScene/FlowView)

FlowScene

  • 继承自 QGraphicsScene

  • 管理:

    • 所有节点和连接

    • 节点创建/删除

    • 连接创建/删除

    • 序列化/反序列化整个图

FlowView

  • 继承自 QGraphicsView

  • 提供:

    • 视图缩放/平移

    • 背景绘制

    • 用户交互入口点

4. 样式系统

StyleCollection

  • 集中管理所有样式对象

  • 提供默认样式

  • 允许全局样式覆盖

样式类 (NodeStyle/ConnectionStyle/FlowViewStyle)

  • 定义各种可视化属性:

    • 颜色

    • 线宽

    • 字体

    • 边距/间距

5. 数据模型注册表 (DataModelRegistry)

  • 维护 NodeDataModel 工厂函数的映射

  • 允许按类型名称创建节点

  • 支持数据类型兼容性检查

关键设计特点

  1. 模型-视图分离

    • 数据模型(NodeDataModel)与图形表示(NodeGraphicsObject)严格分离

    • 通过信号槽通信

  2. 灵活的样式系统

    • 支持全局样式覆盖

    • 允许单个元素自定义样式

  3. 可扩展的架构

    • 通过继承 NodeDataModel 创建自定义节点

    • 通过 DataModelRegistry 注册新节点类型

  4. 完善的交互支持

    • 内置节点拖动、连接创建、选择等交互

    • 提供交互事件钩子

  5. 序列化支持

    • 整个图可以保存/加载

    • 自定义节点可以扩展序列化数据

典型使用流程

  1. 创建自定义节点

    class MyNodeModel : public NodeDataModel {
      // 实现必要接口...
    };
  2. 注册节点类型

    registry->registerModel<MyNodeModel>("My Node Type");
  3. 创建场景和视图

    FlowScene scene;
    FlowView view(&scene);
  4. 通过工厂创建节点

    auto& node = scene.createNode(registry->create("My Node Type"));
  5. 处理节点连接和数据流

    • 框架自动处理连接可视化

    • 在 setInData()/outData() 中实现数据逻辑

这个框架非常适合需要可视化编程界面的应用,如材质编辑器、蓝图系统、数据处理管道等场景。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值