视图的缩放:spa
对视图进行缩放,主要是重写wheelEvent事件code
void Myview::wheelEvent(QWheelEvent *event)//重写滚轮事件 { qreal factor_out = transform().scale(1.2, 1.2).mapRect(QRectF(0,0,1,1)).width(); qreal factor_in=transform().scale(1/1.2,1/1.2).mapRect(QRectF(0,0,1,1)).width(); if(event->delta()>0){ if(factor_out>70) return;//防止视图过大 scale(1.2,1.2);//放大 } else if(event->delta()<0){ if(factor_in<0.1)return;//防止视图太小 scale(1/1.2,1/1.2);//缩小 } }
为了改善缩放效果,以鼠标为中心进行缩放,则须要添加如下代码:
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
视图的平移:orm
实现视图的平移要比缩放复杂一些,须要重写三个鼠标事件:mousePressEvent、mouseMoveEvent、mouseReleaseEvent。对象
大概过程以下:(1)按下:鼠标左键->改变光标、触发平移信号(bool值为真)->记录鼠标按下的初始坐标blog
(2)移动:接收到平移信号->计算移动距离->记录鼠标最后的坐标(做为下一次平移的起点坐标)事件
(3)释放:恢复以前平移信号和光标形状io
void Myview::mousePressEvent(QMouseEvent *event) { if (event->button() == translateButton) { //若按下左键 QCursor cursor1;//建立光标对象 cursor1.setShape(Qt::OpenHandCursor);//设置光标形态为手掌 setCursor(cursor1); //使用手掌光标 //qDebug()<<mapToScene(event->pos()); sign = true;//触发平移信号 lastPos = event->pos(); } QGraphicsView::mousePressEvent(event); } void Myview::mouseMoveEvent(QMouseEvent *event) { if (sign==true){ QPointF mouseDelta = event->pos() - lastPos; translate(mouseDelta); } lastPos = event->pos(); QGraphicsView::mouseMoveEvent(event); } void Myview::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == translateButton) sign = false; setCursor(cursor); //拖动完成后,光标恢复默认形状 QGraphicsView::mouseReleaseEvent(event); } // 平移 void Myview::translate(QPointF delta) { delta *= translateSpeed; // view 根据鼠标下的点做为锚点来定位 scene setTransformationAnchor(QGraphicsView::AnchorUnderMouse); QPoint newCenter(VIEW_WIDTH/2-delta.x(),VIEW_HEIGHT/2-delta.y()); centerOn(mapToScene(newCenter)); // scene 在 view 的中心点做为锚点 setTransformationAnchor(QGraphicsView::AnchorViewCenter); }
视图的翻转(Y轴):event
以前写的代码是对图元的翻转,其自己坐标发生了改变,为了改善这个问题,能够对整个视图进行翻转,从而保证图元坐标不发生变化。ast
QTransform transform; transform.rotate(180,Qt::XAxis);//视图绕x轴旋转180度 view->setTransform(transform);