QT图元的连接
QT中图元使用线连接
关于线图元的设计请看我上一篇文章。
思考
在使用线图元(LineObject)将两个其他图元(A,B,…)连接之后,若要在移动其他图元时让线图元也跟随移动(重绘),可以让线图元维护两个节点(Line_Node_1和Line_Node_2),这两个节点分别与A、B两个图元相连接,而A,B两图元也分别维护着自己的节点,如下图所示
当使用线图元将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
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 云边小卖部!