QGraphicsItem旋转后,改变大小会让item平移

本文章重点表述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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值