QT——在QGraphicsScene中限制圖元的拖動范圍


欲使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按照指定路線被拖動。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM