旋转后的QGraphicsRectItem鼠标拖拽时随机移动并消失问题求助
拖拽异常原因分析
坐标体系混淆
QGraphicsItem的鼠标事件返回的event.pos()是item自身局部坐标系下的坐标,当你给item设置了旋转属性后,这个局部坐标系的x/y轴已经跟着旋转了,和未旋转的矩形形状的坐标轴、场景坐标系的坐标轴均不再重合。你直接用旋转后的坐标计算得到的x_diff、y_diff,本质是旋转后的坐标系下的偏移量,直接用来平移未旋转的rect_shape,会出现位移方向和鼠标移动方向不匹配的问题,旋转角度越大偏差越明显,90度时横纵偏移直接互换,就会出现控件乱跑的现象。拖拽逻辑冲突
你同时开启了QGraphicsItem.ItemIsMovable标志,又重写了mouseMoveEvent自行修改矩形位置,两个逻辑会产生冲突。默认的ItemIsMovable会自动修改item在场景中的pos()属性实现移动,而你自己写的代码是修改item内部的矩形坐标、还动态修改变换原点,两个操作叠加作用就会产生异常的累加位移,最终导致控件超出可视区域消失。
修复方案
如果只需要实现普通的拖拽移动功能,直接删掉你重写的mousePressEvent和mouseMoveEvent即可,Qt自带的ItemIsMovable已经适配了任意旋转角度下的拖拽逻辑,无需额外编码。
如果后续需要实现拖拽边缘改大小等自定义交互,必须自行处理鼠标事件的话:
- 先关闭
ItemIsMovable标志,避免逻辑冲突 - 不要用局部坐标计算偏移,改用
event.scenePos()获取全局场景坐标计算位移,再映射到item的坐标系中,即可规避旋转带来的坐标偏差。
内容的提问来源于stack exchange,提问作者jon_bovi
相关产品推荐
相关产品推荐

