QGraphicsView 自由拖拽画布实现

QGraphicsView 自由拖拽画布的一种解决方法

介绍

这是一种相对来说比较取巧的方法,因为系统限制了只能在scene rect的范围内拖动画布,所以我是采取放大rect的方式实现拖拽。

还看到“一去二三里"博主写的通过记录上一个鼠标点,重写鼠标事件实现的超范围拖拽,但是这种实现的方式需要同时绑定scale,我的放大缩小又比较自由,所以使用起来会有很多局限。但是该博主方法不会影响scene的区域大小是一个优点,因为暂时无法确定rect的影响范围,就目前使用一段时间来说暂未发现其他影响。

实现思路

在使用setDragMode(QGraphicsView::ScrollHandDrag); //set hand move view table时,在空白处拖动即可以实现画布的拖拽,但是有个限制不可以超出屏幕或者说是不可以超出所有items rect的范围,如下图所示:

在这里插入图片描述

放大scene的范围后:

在这里插入图片描述

具体实现代码

该功能实现需要重写QGraphicsView,在我之前的一篇文章文章中已经附上了实现代码(QGraphics Scene、Graphics Item、Graphics View关系及一个实例),这里补充实现上述放大scene区域的代码。

void MyGraphicView::updateSceneRect()
{
    QRectF rectTmp = scene()->sceneRect();	//获得当前view scene的区域
    QPointF ptTopLeft = rectTmp.topLeft();	//获得区域左上点和右下点坐标
    QPointF ptBottomRight = rectTmp.bottomRight();
    QPointF ptW_H = 0.5 * QPointF(rect().width(), rect().height());	//这一步主要是为了后边放大区域的范围,0.5这个系数可以修改
    ptTopLeft -= ptW_H;	//左上点向左上方平移
    ptBottomRight += ptW_H;	//右下点向右下平移
    rectTmp.setTopLeft(ptTopLeft);	//按照左上左下点修改rect的大小
    rectTmp.setBottomRight(ptBottomRight);
    scene()->setSceneRect(rectTmp);//更新scene rect的范围
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

机器人梦想家

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值