以鼠标位置为锚点对QGraphicsView进行缩放

想要将继承QGraphicsView的子类视图进行缩放需要重写下面的父类方法。

void wheelEvent(QWheelEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *mouseEvent) override;
double m_dOriScale;//视图的原始比例

构造函数中设置视图样式和开放必要属性功能

ImageGraphicsView::ImageGraphicsView()
{
	m_dOriScale = 1;//图形原始比例
	setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//隐藏水平条
	setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//隐藏竖条
	setTransformationAnchor(QGraphicsView::AnchorUnderMouse);//以鼠标位置为缩放锚点
	setDragMode(QGraphicsView::ScrollHandDrag);//默认手形拖动
}
void ImageGraphicsView::wheelEvent(QWheelEvent *event)
{
	if ((event->angleDelta().y() > 0) && (m_dOriScale >= 50))//最大放大到原始图像的50倍
		return;
	else if ((event->angleDelta().y() < 0) && (m_dOriScale <= 0.01))//图像缩小到自适应大小之后就不继续缩小
		return;

	qreal scaleFactor = this->matrix().m11();
	m_dOriScale = scaleFactor;
	int wheelDeltaValue = event->angleDelta().y();
	if (wheelDeltaValue > 0)//放大
		this->scale(1.2, 1.2);
	else//缩小
		this->scale(1.0 / 1.2, 1.0 / 1.2);
	update();
}

void ImageGraphicsView::mousePressEvent(QMouseEvent *event)
{
	QPointF point = mapToScene(event->pos());
	if(!this->sceneRect().contains(point))
	{
		event->ignore();
		return;
	}
	QGraphicsView::mousePressEvent(event);
}

void ImageGraphicsView::mouseReleaseEvent(QMouseEvent *mouseEvent)
{
	QPointF point = mapToScene(event->pos());
	if(!this->sceneRect().contains(point))
	{
		event->ignore();
		return;
	}
	QGraphicsView::mouseReleaseEvent(event);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值