QGraphicsItem中进行setScale和moveBy的操作会导致在绘画的图片在场景中位置不准确

         这是第一张加载的图片,也就是我想要的位置。浅灰色区域就是QGraphicsItem控件大小,也是图片大小,而外部白色的线的范围就是QGraphicsView的范围,进行缩放和移动,也就是运用setScale和moveBy函数,旋转没有测试过,切换到别的界面窗口,再切换回来,替换QGraphicsItem控件中图片,新的图片不会出现在如第一张的位置,而是图二的这样的位置。当然在更新图片时也会设置this->setPos(x,y);设置一个固定位置,就是Pos()函数中打印的值没有变,只是QGraphicsView显示变了。我找了一种方法可以解决这个问题,在3中,但具体原因还在研究中。

  1.在鼠标移动中

void Edit_qgraphicsitem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    if(isActive)
    {
        m_isMouseMove = true;
        if(m_isMousePress)
        {
            if(m_currCursor == m_moveCursor)
            {
                //移动的效果
                QPointF point = (event->pos() - m_pressedPose) * m_scaleValue;
//                prepareGeometryChange();
                moveBy(point.x(),point.y());
                qDebug()  << pos();
            }
             m_endPose = event->pos();

            //画笔
            m_Polygon.append(event->pos());
        }
        update();
    }
}

2.在滑轮缩放中

void Edit_qgraphicsitem::wheelEvent(QGraphicsSceneWheelEvent *event)
{
    if(isActive)
    {
        if(m_currCursor == m_moveCursor)
        {
            double beforeScaleValue = m_scaleValue;
            if(event->delta()>0){
                //        qDebug()<<"放大";
                m_scaleValue *= 1.1; //每次放大10%
            }else{
                //        qDebug()<<"缩小";
                m_scaleValue *= 0.9; //每次缩小10%
            }
            setScale(m_scaleValue);
            //使放大缩小的效果看起来像是以鼠标中心点进行放大缩小
            if(event->delta()>0){
                moveBy(-event->pos().x()*beforeScaleValue*0.1,-event->pos().y()*beforeScaleValue*0.1);
            }else{
                moveBy(event->pos().x()*beforeScaleValue*0.1,event->pos().y()*beforeScaleValue*0.1);
            }
            update();
        }
    }
}

3.解决方法:每次进行setScale和moveBy改变时,就把它加入到改变之后,就不会出现切换界面导致在scene中位置出现偏差。

       //处理经过moveby和setScale导致的中心点偏移,具体原因不明
        QRectF boundingRect = this->scene()->itemsBoundingRect();
        this->scene()->setSceneRect(boundingRect);
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值