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

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

文章目录

  • 介绍
  • 实现思路
  • 具体实现代码

介绍

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

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

实现思路

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

QGraphicsView 自由拖拽画布的一种解决方法_第1张图片

放大scene的范围后:

QGraphicsView 自由拖拽画布的一种解决方法_第2张图片

具体实现代码

该功能实现需要重写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的范围
}

你可能感兴趣的:(QT)