欲使QGraphicsItem可拖動,則需設置標志位:setFlag(ItemIsMovable,true);
而如果想限制QGraphicsItem對象的移動范圍,需要繼承QGraphicsItem類,重載itemChange()虛函數,關於該函數的重載,QT文檔中示例如下:
QVariant Component::itemChange(GraphicsItemChange change, const QVariant &value) { if (change == ItemPositionChange && scene()) { // value is the new position. QPointF newPos = value.toPointF(); QRectF rect = scene()->sceneRect(); if (!rect.contains(newPos)) { // Keep the item inside the scene rect. newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left()))); newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top()))); return newPos; } } return QGraphicsItem::itemChange(change, value); }
ItemPositionChange 用於通知所屬QGraphicsItem的位置即將發生變化,而value的值即為QGraphicsItem將來的位置坐標,以上代碼把item將來的位置坐標value與scene rect 的上下左右邊界進行比較,根據比較結果更改value,使其取值在scene rect 范圍內, 進而達到了限制item拖動范圍的目的。
但上述代碼只有在QGraphicsScene的大小已經被事先設定好了才好用,如果預先未設置QGraphicsScene大小,那么scene的大小將隨着item的添加不斷增大,這種范圍的限制就沒什么意義了。
如果我們即想將scene設為自動無限增大的,又想限制item在某方向的拖動,只要找到限制拖動的那條基准線的橫坐標或者縱坐標,按照與上述代碼中同樣的原理,就可輕松限制item的拖動,甚至可以使item按照指定路線被拖動。