一:
先来看一下界面的截图:

 
说明:
拖动节点的时候,与该节点相关的箭头连线也会跟着调整;
用户可以使用鼠标从一个节点拖出一个箭头到另一个节点(鼠标在空白区域点击一下,拖出的箭头消失)
 
这三个图标,手型图标处于选中状态的时候,节点可以拖动,
箭头图标处于选中状态的时候,可以使用鼠标绘制连线箭头
最后一个图标,用于在画布上创建一个节点方框
 
二:
关键代码文件如下图(用红框框住的为关键代码文件)
其他文件均为辅助代码文件(有些文件中的代码没有用到)
 
三:

CustomView类是我们的绘图面板,这个类继承自QGraphicsView

在这个类的构造函数中,我们创建了他的QGraphicsScene

并设置了它的大小(这也是为什么我们的绘图板有滚动条的原因)
另外需要注意的是QGraphicsScene的坐标原点在中心位置,如下图所示

 
 
四:
CustomArrow是描述箭头连线的类:

这个类继承自QGraphicsItem

boundingRect是QGraphicsItem的虚函数,必须要实现,

其中1.5是箭头连线的线宽,8是箭头张开后所占的区域宽度
p1是箭头的起始点,p2是箭头结束点(也就是带箭头的那一端)
最终返回的一个Rect结构如下图所示:(注意箭头的起点,在上一个方框的中心点上)
 
五:
我给CustomArrow类公开了一个adjust函数,旨在当方框节点移动的时候,重新计算箭头的起始位置、结束位置、箭头的角度
代码如下:
 
其中:itemA是起始处的方框节点,itemB是结束处的方框节点
注意mapFromItem是把方框节点中心点映射到scene坐标系中
紧接着的if,else是为了判断起始方框是否位于结束方框的下方,如果是,那么箭头的终点应该在结束方框的下边框上
接下来是计算出箭头的两个点arrowP1和arrowP2
 
六:
绘制箭头的工作是在CustomArrow的paint函数中完成的,代码如下所示
箭头只不过是一个多边形,用drawPolygon画出来的
 
七:

CustomRect继承自QGraphicsRectItem

在这个类型中,我们重载了itemChange函数,代码如下
当当前方框节点移动后,与这个节点相关的箭头都要跟着移动
Arrows就是与当前方框节点有关的箭头
 
八:
在来看一下CustomRect的MousePressEvent的代码
在这个代码中,
我们先为全局标志ScenClickFlag赋值,
这个标志着当前点击的是一个方框节点,还是点击在画布的空白处了
接下来判断箭头按钮是不是处于选中状态
再往下判断是不是已经记录了起始方框,如果没记录,那么就记录并返回
再接下来,就意味着用户是点击的结束方框,这时要绘制一个箭头了,
当然首先要判断是不是已经存在了同样的箭头,如果存在了,就没必要再绘制了,
ScenClickFlag置成true是为了冒泡触发画布的点击事件(后续会讲为什么要允许事件冒泡)
接下来执行了绘制箭头的逻辑,并在起始节点和结束节点分别记录了箭头的指针
以后这两个节点移动的时候,箭头也会跟着移动了。
 
 
 
未完待续,喜欢的话请点推荐(您的支持,是我的动力)--------------------->
代码会在下一篇文章中发布
 
 

基于Qt的流程设计器(一)的更多相关文章

  1. 可视化流程设计——流程设计器演示(基于Silverlight)

    上一篇文章<通用流程设计>对鄙人写的通用流程做了一定的介绍,并奉上了相关源码.但一个好的流程设计必少不了流程设计器的支持,本文将针对<通用流程设计>中的流程的设计器做一个简单的 ...

  2. YbSoftwareFactory 代码生成插件【十六】:Web 下灵活、强大的审批流程实现(含流程控制组件、流程设计器和表单设计器)

    程序=数据结构+算法,而企业级的软件=数据+流程,流程往往千差万别,客户自身有时都搞不清楚,随时变化的情况更是家常便饭,抛开功能等不谈,需求变化很大程度上就是流程的变化,流程的变化会给开发工作造成很大 ...

  3. F2工作流引擎之-纯JS Web在线可拖拽的流程设计器(八)

          Web纯JS流程设计器无需编程,完全是通过鼠标拖.拉.拽的方式来完成,支持串行.并行.分支.异或分支.M取N路分支.会签.聚合.多重聚合.退回.传阅.转交,都可以非常方便快捷地实现,管理员 ...

  4. 纯JS Web在线可拖拽的流程设计器

    F2工作流引擎之-纯JS Web在线可拖拽的流程设计器 Web纯JS流程设计器无需编程,完全是通过鼠标拖.拉.拽的方式来完成,支持串行.并行.分支.异或分支.M取N路分支.会签.聚合.多重聚合.退回. ...

  5. .NET 开源工作流: Slickflow流程引擎高级开发(十) -- BpmnJS流程设计器集成

    前言: 在Slickflow产品开发过程中,前端流程设计器经历了几个不同的版本(jsPlumb, mxGraph等),目的是为了在设计流程时的用户体验更加良好,得到客户的好评和认可.BpmnJS流程设 ...

  6. activiti工作流的web流程设计器整合视频教程 SSM和独立部署

    本视频为activiti工作流的web流程设计器整合视频教程 整合Acitiviti在线流程设计器(Activiti-Modeler 5.21.0 官方流程设计器) 本视频共讲了两种整合方式 1. 流 ...

  7. activiti工作流的web流程设计器整合视频教程 SSM 和 独立部署

    本视频为activiti工作流的web流程设计器整合视频教程 整合Acitiviti在线流程设计器(Activiti-Modeler 5.21.0 官方流程设计器) 本视频共讲了两种整合方式 1. 流 ...

  8. silverlight 流程设计器,流程引擎

    (图一流程设计器包含元素) (图一流程设计器实现功能) (流程引擎工作原理) (流程数据库设计) (流程数据库设计) (流程数据库设计) (工作流程设计器实现效果图) (代码结构图) 无法上传附件,需 ...

  9. activiti工作流的web流程设计器整合视频教程

    本视频为activiti工作流的web流程设计器整合视频教程 整合Acitiviti在线流程设计器(Activiti-Modeler 5.21.0 官方流程设计器) 本视频共讲了两种整合方式 1. 流 ...

随机推荐

  1. javascript高级程序设计--笔记01

    概述 JavaScript的实现包含三个部分: 1  核心(ECMAScript)   提供核心语言功能 2  文档对象模型(DOM)  一套提供了访问以及操作网页内容的API 3  浏览器对象模型( ...

  2. python生成中文验证码,带旋转,带干扰噪音线段

    # -*- coding: utf-8 -*- """ Created on Sun Oct 4 15:57:46 2015 @author: keithguofan & ...

  3. 使用nssm在windows服务器上部署nodejs

    Linux上,可以轻松的使用forever或者pm2来部署nodejs应用.但是在windows下就麻烦了,pm2明确的说支持Linux & MacOS,forever在windows下貌似问 ...

  4. sin, miss the mark, correct our aim and try again

    Guilt should only be a call to action. When we see that we "missed the mark"(the meaning o ...

  5. git服务器的搭建

    http://blog.jobbole.com/25944/ 1,概念 git服务器:就是一个仓储,一个大家都可以访问的公共仓储,大家可以从这个仓储中拉取和推送数据. 协议: 与gist服务通讯的仓储 ...

  6. EditText的一些属性及用法

    EditText的一些属性及用法设置当EditText获得焦点时把文本框的内容全选中android:selectAllOnFocus="true"设置某个EditText默认获得焦 ...

  7. textarea 怎么固定大小,不让调整

    1:彻底禁用拖动(推荐) resize: none; 2:只是固定大小,右下角的拖动图标仍在 width: 200px; height: 100px; max-width: 200px; max-he ...

  8. Java核心知识点学习----线程中如何创建锁和使用锁 Lock,设计一个缓存系统

    理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...

  9. Java语言环境(JDK的安装教学)

    //此文档由徐浩军编写(32/64位系统都适用) 1.下载JDK安装包你 2.点击安装包开始安装 3.首先你要选择安装地址一般情况下,都会选择默认地址. (请记住这个地址,之后配置环境变量的时候需要用 ...

  10. mysql学习-windows下绿色版mysql安装问题解决办法

    1.下载绿色版mysql 从该地址http://dev.mysql.com/downloads/mysql/ 中选择windows的版本,选择下载. 2.将下载的压缩包解压. 3.将根目录下的my-d ...