这是第一张加载的图片,也就是我想要的位置。浅灰色区域就是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);