Qt QGraphicsView 在鼠標點擊處進行放大縮小


一、前段時間在用QGraphicsView對圖元進行放大縮小時,發現圖形總是越來越跑偏,無法像地圖中那樣,點擊哪里就能放大哪個地方。
如下所示:此時放大縮小的焦點並不在鼠標位置

最初的效果

方法,使用QGraphicsView類的設置屬性函數.在構造函數中增加下面兩個函數即可。

1 setTransformationAnchor(QGraphicsView::AnchorUnderMouse); 2 setResizeAnchor(QGraphicsView::AnchorUnderMouse);

此時以鼠標為中心的效果就出來了:
改進后的效果

完整代碼:

 1 MyGraphicsView::MyGraphicsView()  2 {  3     setDragMode(QGraphicsView::NoDrag);//(QGraphicsView::RubberBandDrag);//QGraphicsView::ScrollHandDrag
 4     scale_m = 1;//圖形原始比例
 5     setStyleSheet("padding: 0px; border: 0px;");//無邊框
 6     setMouseTracking(true);//跟蹤鼠標位置
 7     setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//隱藏水平條
 8     setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//隱藏豎條
 9  setTransformationAnchor(QGraphicsView::AnchorUnderMouse); 10  setResizeAnchor(QGraphicsView::AnchorUnderMouse); 11     
12 } 13 void MyGraphicsView::wheelEvent ( QWheelEvent * event ) 14 { 15     if (event->modifiers() == Qt::CTRL) 16     {//按住ctrl鍵 可以放大縮小
17         if((event->delta() > 0)&&(scale_m >= 50))//最大放大到原始圖像的50倍
18  { 19             return; 20  } 21         else if((event->delta() < 0)&&(scale_m <= 0.01))//圖像縮小到自適應大小之后就不繼續縮小
22  { 23             return;//重置圖片大小和位置,使之自適應控件窗口大小
24  } 25         else
26  { 27             // 當前放縮倍數;
28             qreal scaleFactor = this->matrix().m11(); 29             scale_m = scaleFactor; 30             
31             int wheelDeltaValue = event->delta(); 32             // 向上滾動,放大;
33             if (wheelDeltaValue > 0) 34  { 35                 this->scale(1.2, 1.2); 36  } 37             else
38             {// 向下滾動,縮小;
39                 this->scale(1.0 / 1.2, 1.0 / 1.2); 40  } 41  update(); 42  } 43  } 44 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM