IPProcessGridScen, IPProcessGrid, IPProcessStep&IPProcessEdge四个类构成了 ImagePlay可视化图像处理系统的核心架构,分别对应 MVC 模式中的不同角色。
IPProcessGridScene (Model-View 中间层)
IPProcessGridScene
继承自 QGraphicsScene,
是 图像处理流程的视觉化与管理核心,负责将算法节点(如OpenCV操作)以网格形式组织,并处理用户交互逻辑
-
核心职责:
✓ 管理所有IPProcessStep
和IPProcessEdge
的存储
✓ 处理拖放事件和场景布局
✓ 维护处理步骤的拓扑关系 -
关键数据:
QList<IPProcessStep*> _steps; // 步骤集合 QList<IPProcessEdge*> _edges; // 连接线集合 IPProcessEdgeTmp* _tmpArrow; // 临时连接线可视化
IPProcessGrid (View-Controller)
IPProcessGrid
继承自 QGraphicsView
,负责管理图像处理节点的网格布局和流程连接。
IPProcessGrid
的作用是:维护所有节点(IPProcess
)的二维网格布局(行列排布),以及管理节点间的数据连接(如将“图像输入”节点连到“滤波器”节点)。
-
核心职责:
✓ 作为场景的视图容器(管理缩放、滚动等)
✓ 控制处理流程的执行(构建队列、线程管理)
✓ 处理键盘/鼠标高级交互(拖拽节点、删除、连线等) -
关键协作:
IPProcessGridScene* _scene; // 关联的场景对象 void execute() { _scene->steps()... // 获取步骤进行执行 }
-
与场景(Scene)的关系
-
IPProcessGrid
可能作为数据模型(Model),而IPProcessGridScene
是其对应的可视化图形场景(基于Qt的QGraphicsScene
)。 -
类似 MVC 模式:
Grid
存储逻辑数据,GridScene
负责渲染和交互。
-
IPProcessStep (Model 元素)
IPProcessStep
继承自 QGraphicsItem
,用于表示图像处理流水线中的单个步骤或节点(例如高斯模糊、边缘检测等操作)。
-
核心职责:
✓ 单个处理步骤的可视化呈现
✓ 管理输入/输出连接关系
✓ 封装处理逻辑(通过IPLProcess
) -
关键数据流:
QList<IPProcessEdge*> _edgesIn; // 输入连接 QList<IPProcessEdge*> _edgesOut; // 输出连接 IPLProcess* _process; // 实际处理逻辑
IPProcessEdge(Model 元素)
IPProcessEdge继承自 QGraphicsItem
,用于表示节点间连接关系(数据流边)的类,负责管理处理节点(IPProcessStep
或 IPProcess
)之间的数据传输逻辑
核心职责:
-
描述数据流向:定义图像处理流水线中节点间的连接关系(例如:将“灰度化”节点的输出传递给“边缘检测”节点)。
-
数据传递控制:管理连接的有效性(如类型检查、防止循环依赖)。
-
可视化绑定:为图形界面(如
IPProcessGridScene
)提供连线的起点、终点坐标等信息。
协同工作流程示例
-
用户添加步骤:
-
IPProcessGrid
接收拖放事件 -
委托给
IPProcessGridScene
创建IPProcessStep
-
场景通知视图更新显示
-
-
创建连接:
-
执行流程:
// 在 IPProcessGrid 中 void execute() { auto steps = _scene->steps(); // 从场景获取步骤 buildQueue(steps); // 构建执行队列 _thread->execute(queue); // 线程执行 }
-
数据反馈:
设计亮点:
-
职责分离:
-
Scene 专注拓扑关系管理
-
View 专注交互和执行控制
-
Step 专注单个元素状态
-
-
事件传播:
// 典型的事件传递路径 QGraphicsView (IPProcessGrid) → QGraphicsScene (IPProcessGridScene) → QGraphicsItem (IPProcessStep)
-
性能优化:
-
增量更新(仅标记脏节点)
-
智能重绘(通过 boundingRect 计算)
-
异步执行(通过 IPProcessThread)
-
这四个类的设计体现了Qt图形视图框架的最佳实践,完美平衡了可视化交互与数据处理的需求。