本文章重点表述QGraphicsItem中,对于旋转后的坐标变化。
我在实现QGraphicsRectItem的缩放和旋转时,遇到了这样一个问题。原本实现的缩放,在旋转后也是能用的。但是涉及到旋转中心的问题,让人有些难以理解,最终分析实践得到下述结论。
进入正题
QGrahpicsItem 对于旋转仅仅是保存了旋转的角度与旋转中心,并不保存旋转之后的坐标。下面看一个例子(这里借用QGraphicsItem旋转后,坐标变化机制解析_xiaonuo911teamo的博客-优快云博客_qgraphicsitem旋转的图片)。
创建矩形
旋转
拉伸后,可以发现上面的绿条(后面正矩形的坐标)已经被我平移了,但是矩形的左上角坐标没有变动,也就实现了肉眼看上去坐标没有变动。
解决方案代码如下:
void GraphicsItemBase::resizeTo(SizeHandleRect::Direction dir, const QPointF &point)
{
//计算正常旋转角度(0度)下,中心的的坐标
auto oldCenter=QPointF(x()+rect().x()+rect().width()/2,y()+rect().y()+rect().height()/2);
//计算旋转后,中心坐标在view中的位置
auto newCenter= mapToScene(rect().center());
//设置正常坐标减去两个坐标的差
auto difference=oldCenter-newCenter;
setPos(x()-difference.x(),y()-difference.y());
//最后设置旋转中心
setTransformOriginPoint(rect().center());
}
附上项目git地址:qq996980215/PrinterEditor: QT设计的打印编辑器,支持dpi自适应,标尺对应显示屏真实dpi,item支持缩放,拉伸,旋转,移动,多选,右击菜单 (github.com)