QT中图元使用线连接

关于线图元的设计请看我上一篇文章。

思考

​ 在使用线图元(LineObject)将两个其他图元(A,B,…)连接之后,若要在移动其他图元时让线图元也跟随移动(重绘),可以让线图元维护两个节点(Line_Node_1和Line_Node_2),这两个节点分别与A、B两个图元相连接,而A,B两图元也分别维护着自己的节点,如下图所示

1660999997943

当使用线图元将A与B连接起来时,线图元的节点将分别与A_Node_1和B_Node_1绑定,Line_Node_A -> A_Node_1 ,Line_Node_B -> B_Node_1,此时当A或B移动时,线图元的节点也将跟随变化,这里线图元维护的两个节点也恰好时线的起始点StartPoint和终止点EndPoint,最后重绘即可。

具体实现

关于节点的绑定:

​ 如果在线图元中定义两个QPointF指针,当鼠标左键点击开始绘制时,首先判断起点处是否有图元存在,如果有图元存在,则判断该图元的节点中哪一个离当前点击的点距离最近,找到最近的那一个,然后重新设置线图元的起点坐标为该点,并使起点节点的指针指向这块地址,同时由于起点节点指针已经不为空,重绘这篇区域,将小圆点覆盖;鼠标拖动绘制;鼠标左键再次点击确定终止点,同样进行判断,最后绑定终点节点,重绘小圆点;如果点击的区域里没有图元存在,则起点坐标就是鼠标点击的坐标,终点同理。

​ 这里存在的一个问题就是,线图元由于存在了两个指针变量,那么在删除线图元是会不会释放掉这块区域,假设已经连接上。一个解决方法是重写析构函数,让指针指向空。

结果

​ 由于itemAt函数得到的对象是QGraphicsItem,与自定义类型CircuitBaseObject类型不匹配,导致无法获取当前区域的Item是哪种类型,gg