对QGraphicsView进行缩放和拖拽

想要将继承QGraphicsView的子类视图进行缩放(以鼠标点击位置缩放)和拖拽需要重写下面的父类方法。

void wheelEvent(QWheelEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *mouseEvent) override;
QPoint m_lastPointF;//记录当前鼠标位置
bool m_bIsPressed;//记录鼠标是否按下
double m_dOriScale;//视图的原始比例

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

ImageGraphicsView::ImageGraphicsView()
{
	setDragMode(QGraphicsView::NoDrag);
    m_dOriScale = 1;//图形原始比例为1
	setStyleSheet("padding: 0px; border: 0px;");//无边框
	setMouseTracking(true);//允许跟踪鼠标位置
	setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//隐藏水平条
	setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//隐藏竖条
	
	//以鼠标点击点为中心放缩需要加下面两句
	setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
	setResizeAnchor(QGraphicsView::AnchorUnderMouse);
}
void ImageGraphicsView::wheelEvent(QWheelEvent *event)
{
	if ((event->delta() > 0) && (m_dOriScale >= 50))//最大放大到原始图像的50倍
		return;
	else if ((event->delta() < 0) && (m_dOriScale <= 0.01))//图像缩小到自适应大小之后就不继续缩小
		return;

	qreal scaleFactor = this->matrix().m11();
	m_dOriScale = 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();
}

void ImageGraphicsView::mousePressEvent(QMouseEvent *event)
{
	if (event->button() == Qt::LeftButton)
	{
		m_lastPointF = event->pos();
		m_bIsPressed = true;
	}

	QGraphicsView::mousePressEvent(event);
}

void ImageGraphicsView::mouseMoveEvent(QMouseEvent *event)
{
	if (m_bIsPressed)
	{
		QPointF disPointF = event->pos() - m_lastPointF;
		m_lastPointF = event->pos();
		setSceneRect(sceneRect().x() - disPointF.x(),
			sceneRect().y() - disPointF.y(),
			sceneRect().width(),
			sceneRect().height());
		update();
	}

	QGraphicsView::mouseMoveEvent(event);
}

void ImageGraphicsView::mouseReleaseEvent(QMouseEvent *mouseEvent)
{
	if (m_bIsPressed)
		m_bIsPressed = false;

	QGraphicsView::mouseReleaseEvent(mouseEvent);
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值