Qt QGraphicsScene中限制图元的拖动范围

欲使QGraphicsItem可拖动,则需设置标志位:setFlag(ItemIsMovable,true);

而如果想限制QGraphicsItem对象的移动范围,需要继承QGraphicsItem类,重载itemChange()虚函数,关于该函数的重载,QT文档中示例如下:

 1 QVariant Component::itemChange(GraphicsItemChange change, const QVariant &value)
 2 {
 3     if (change == ItemPositionChange && scene()) {
 4         // value is the new position.
 5         QPointF newPos = value.toPointF();
 6         QRectF rect = scene()->sceneRect();
 7         if (!rect.contains(newPos)) {
 8             // Keep the item inside the scene rect.
 9             newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));
10             newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top())));
11             return newPos;
12         }
13     }
14     return QGraphicsItem::itemChange(change, value);
15 }

ItemPositionChange 用于通知所属QGraphicsItem的位置即将发生变化,而value的值即为QGraphicsItem将来的位置坐标,以上代码把item将来的位置坐标value与scene rect 的上下左右边界进行比较,根据比较结果更改value,使其取值在scene rect 范围内, 进而达到了限制item拖动范围的目的。

但上述代码只有在QGraphicsScene的大小已经被事先设定好了才好用,如果预先未设置QGraphicsScene大小,那么scene的大小将随着item的添加不断增大,这种范围的限制就没什么意义了。

如果我们即想将scene设为自动无限增大的,又想限制item在某方向的拖动,只要找到限制拖动的那条基准线的横坐标或者纵坐标,按照与上述代码中同样的原理,就可轻松限制item的拖动,甚至可以使item按照指定路线被拖动。

原文地址:https://www.cnblogs.com/ybqjymy/p/13528859.html