QT QGraphicsView 在鼠标点击处进行放大缩小

本文介绍如何解决QGraphicsView在放大缩小时图形偏移的问题,通过设置属性使放大缩小以鼠标位置为中心,实现地图类应用的平滑缩放效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前段时间在用QGraphicsView对图元进行放大缩小时,发现图形总是越来越跑偏,无法像地图中那样,点击哪里就能放大哪个地方。
如下所示:此时放大缩小的焦点并不在鼠标位置最初的效果
方法,使用QGraphicsView类的设置属性函数.在构造函数中增加下面两个函数即可。

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

此时以鼠标为中心的效果就出来了:
改进后的效果
完整代码:

MyGraphicsView::MyGraphicsView()
{
	setDragMode(QGraphicsView::NoDrag);//(QGraphicsView::RubberBandDrag);//QGraphicsView::ScrollHandDrag
	scale_m = 1;//图形原始比例
	setStyleSheet("padding: 0px; border: 0px;");//无边框
	setMouseTracking(true);//跟踪鼠标位置
	setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//隐藏水平条
	setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//隐藏竖条
	setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
	setResizeAnchor(QGraphicsView::AnchorUnderMouse);
	
}
void MyGraphicsView::wheelEvent ( QWheelEvent * event )
{
	if (event->modifiers() == Qt::CTRL)
	{//按住ctrl键 可以放大缩小
		if((event->delta() > 0)&&(scale_m >= 50))//最大放大到原始图像的50倍
		{
			return;
		}
		else if((event->delta() < 0)&&(scale_m <= 0.01))//图像缩小到自适应大小之后就不继续缩小
		{
			return;//重置图片大小和位置,使之自适应控件窗口大小
		}
		else
		{
			// 当前放缩倍数;
			qreal scaleFactor = this->matrix().m11();
			scale_m = scaleFactor;
			
			int wheelDeltaValue = event->delta();
			// 向上滚动,放大;
			if (wheelDeltaValue > 0)
			{
				this->scale(1.2, 1.2);
			}
			else
			{// 向下滚动,缩小;
				this->scale(1.0 / 1.2, 1.0 / 1.2);
			}
			update();
		}
	}	
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼儿LY

一切随缘

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值