跳转至

工作流生命周期

节点创建过程生命周期

节点从创建到销毁涉及到的回调如下表所示:

表 节点添加过程生命周期

顺序 函数/信号 说明
1 DAAbstractNodeFactory nodeAddedToWorkflow 节点即将加入workflow的回调
2 DAWorkFlow nodeAdded 添加节点完成触发的信号

表 节点移除过程生命周期

顺序 函数/信号 说明
1 DAAbstractNodeFactory nodeStartRemove 节点即将移出workflow的回
2 DAWorkFlow nodeRemoved 移除节点完成触发的信号

节点在添加和删除前都会触发工厂的回调,针对一些全局属性可以通过工厂的回调进行操作,例如对节点进行编号或者拓扑检查等等

节点连线过程生命周期

节点连线过程的生命周期涉及的回调较多,这些回调的目的是辅助判断节点的连接交互过程使能,以及针对一些特殊的节点实现动态连接,节点开始连接到连接成功涉及到的回调有如下函数

表 节点开始连接过程的调用过程

顺序 函数 说明
1 DAAbstractNodeGraphicsItem tryLinkOnItemPos 节点点击会触发此回调,此回调可以针对没有固定节点的元件进行动态连接点生成的操作
2 DAAbstractNodeGraphicsItem getLinkPointByPos 获取是否点击到连接点,只有点击到连接点,才会进入连接模式
3 DANodeGraphicsScene nodeItemLinkPointSelected EMIT 发射连接点被选中信号
4 DAAbstractNodeGraphicsItem createLinkItem 创建连接线
5 DAAbstractNodeLinkGraphicsItem attachFrom 建立开始连接方法,只有此方法返回true,才会进入连接模式
6 DAGraphicsScene beginLink 开始连接,连接线交由场景管理

用户在点击节点的输出连接点时,首先会调用DAAbstractNodeGraphicsItem::tryLinkOnItemPos回调函数,这个函数的作用是用于给元件判断是否要动态生成连接点,有些特殊的节点没有固定的连接点,需要根据情景动态生成的时候,可以重写此函数,在用户点击的位置进行连接点的生成

DAAbstractNodeGraphicsItem::tryLinkOnItemPos函数之后将会调用DAAbstractNodeGraphicsItem::getLinkPointByPos来看看是否点击到了连接点,如果是则准备进入连接状态,如果不是就跳过,因此,针对那些需要动态生成连接点的特殊元件,DAAbstractNodeGraphicsItem::tryLinkOnItemPos函数可以在点击的位置生成一个连接点,以便DAAbstractNodeGraphicsItem::getLinkPointByPos能获取到一个具体连接点从而进入连接状态

如果DAAbstractNodeGraphicsItem::getLinkPointByPos返回一个有效的连接点,则进入连接状态,DANodeGraphicsScene会发射nodeItemLinkPointSelected信号:

1
void nodeItemLinkPointSelected(DA::DAAbstractNodeGraphicsItem* item,const DA::DANodeLinkPoint& lp,QGraphicsSceneMouseEvent* event);

此信号发射完成后,会调用DAAbstractNodeGraphicsItem::createLinkItem函数,来生成一个连接线的图元,如果此函数返回值为nullptr,则不会创建连接线,但上面的信号会发射

生成连接线后,会调用连接线图元的 DAAbstractLinkGraphicsItem::attachFrom函数,这个函数将连接线与节点关联起来,如果节点不接受连接线,此函数会返回false,结束连接,返回true则说明可以开始连接

创建完连接线后,连接线会绑定图元所点击的连接点,同时,调用DAGraphicsScene::beginLink方法。DAGraphicsScene::beginLink是一个很关键的方法,DAGraphicsScene所有涉及连接的操作都需要用到此方法。这个方法会把连接线加入场景中,并交由场景管理,这时,在连接线未完成时,连接线的末端会随着鼠标移动而移动。调用DAGraphicsScene::beginLink后,DAGraphicsScene::isStartLink方法会返回true

上面是连接线从开始连接点连接的调用过程

连接过程从图元的输出连接点点击后开始,到点击到其它图元的输入连接点为结束,连接点结束连接过程的调用过程如下:

表 节点结束连接过程的调用过程

顺序 函数 说明
1 DAGraphicsScene isStartLink 判断当前是否在连接状态
2 DAGraphicsScene getCurrentLinkItem 获取当前管理的连接线
3 DAAbstractNodeGraphicsItem tryLinkOnItemPos 节点点击会触发此回调,此回调可以针对没有固定节点的元件进行动态连接点生成的操作
4 DAAbstractNodeGraphicsItem getLinkPointByPos 获取是否点击到连接点,只有点击到连接点,才会进入连接模式
5 DANodeGraphicsScene nodeItemLinkPointSelected EMIT 发射连接点被选中信号
6 DAAbstractNodeLinkGraphicsItem attachTo 调用连接线的 attachTo方法,只有此方法返回 true,才会进入后面的结束连接过程
6.1 - DAAbstractNode linkTo 节点的linkto方法
6.2 - DAAbstractNode finishLink 如果连接完成,会分别调用DAAbstractNode的finishLink回调方法
6.3 - DAAbstractNodeLinkGraphicsItem finishedNodeLink node的finishLink回调结束后,调用连接线的finishedNodeLink回调,通知item,节点完成了连接
7 DANodeGraphicsScene addNodeLink_ 把连接线用命令管理起来,可以实现redo/undo
8 DAGraphicsScene endLink 调用结束连接方法,通知场景,结束连接线的管理,这时连接线不会跟随鼠标移动,场景不在管理连接线的状态
9 DAAbstractNodeLinkGraphicsItem willCompleteLink 调用连接线结束连接回调,这个回调可以实现一些连接线完成连接后的动作,例如改变颜色,改变渲染方式等等
10 DAGraphicsScene linkCompleted EMIT 发射连接完成信号

首先通过DAGraphicsScene::isStartLink判断当前是否处于连接状态,如果是,则会调用DAGraphicsScene::getCurrentLinkItem获取场景当前正在管理的连接线图元,连接线图元是通过DAGraphicsScene::beginLink函数设置进去的

接着和开始连接一样,结束连接过程也会调用DAAbstractNodeGraphicsItem::tryLinkOnItemPos回调函数,DAAbstractNodeGraphicsItem::tryLinkOnItemPos函数之后将会调用DAAbstractNodeGraphicsItem::getLinkPointByPos

如果DAAbstractNodeGraphicsItem::getLinkPointByPos返回一个有效的连接点,则开始进入结束连接状态,和开始连接过程一样,DANodeGraphicsScene会发射nodeItemLinkPointSelected信号

接下来将会调用DAAbstractNodeLinkGraphicsItem::attachTo方法,这个方法是绝对是否连接完成的关键,此方法返回true,则表示连接成功,节点接受连接,否则失败,如果失败,则会结束连接状态判定,用户可以继续连接,场景依旧处于连接状态

DAAbstractNodeLinkGraphicsItem::attachTo方法返回true,说明这次连接完成

DAAbstractNodeLinkGraphicsItem::attachTo方法里涉及较多节点相关的操作:
- 首先会调用节点DAAbstractNode::linkTo方法
- 然后,调用节点的DAAbstractNode::finishLink回调
- 最后调用DAAbstractNodeLinkGraphicsItem::finishedNodeLink回调

DAAbstractNodeLinkGraphicsItem::attachTo之后会调用DANodeGraphicsScene::addNodeLink_函数,把连接线添加到回退栈中,可以实现连接线的redo/undo

之后调用DAGraphicsScene::endLink函数,此函数会告诉场景结束连接,并清除连接线的管理,这个函数里面会调用DAAbstractNodeLinkGraphicsItem::willCompleteLink回调,这个回调可以进行一些操作,这个回调可以实现一些连接线完成连接后的动作,例如改变颜色,改变渲染方式等等

注意:finishedNodeLinkwillCompleteLink都是表示连接完成,但finishedNodeLink更早,它代表了节点完成了连接,是逻辑层面的完成,willCompleteLink是代表视图层面的完成连接,它发生的更晚,原则上,finishedNodeLink如果触发,那么willCompleteLink就应该返回ture,如果finishedNodeLink触发了,但willCompleteLink就应该返回false,将导致逻辑和视图的不一致,会引发一些问题

最后,场景将会发出DAGraphicsScene::linkCompleted信号,这时,一个完整的连接过程结束

点击输出点的回调过程

节点在连接过程可以进行中断操作,中断会触发prepareLinkOutputFailed回调

中断连接回调

节点1的输出完成连接到节点2的输入,首先会触发节点2的prepareLinkInput回调,再根据结果触发触发prepareLinkInputSucceed或prepareLinkInputFailed回调

完成节点连接的回调

通过节点连接线的回调,可以实现不固定的输入或输出点