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的范围
}