一、前段时间在用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 }