視圖的縮放: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);