14

(0; 0)から(481; 270)までの固定寸法のシーンがあります。

scene->setSceneRect(0, 0, 481, 270);

その中には習慣がGraphicsItemあり、旗のおかげで動かすことができItemisMovableますが、シーン内にとどまりたいです。実際には、(0; 0)より下でも(481; 270)より上でも座標を持たせたくないということです。

QGraphicsItem::itemChange()オーバーライドやさらにQGraphicsItem::mouseMoveEvent()は、やりたいことを達成できないなど、いくつかの解決策を試しました。

私のニーズに適したソリューションは何ですか?私はQGraphicsItem::itemChange()ひどく使用しますか?

前もって感謝します。

4

3 に答える 3

13

QGraphicsItem::mouseMoveEvent()次のようにオーバーライドできます。

YourItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    QGraphicsItem::mouseMoveEvent(event); // move the item...

    // ...then check the bounds
    if (x() < 0)
        setPos(0, y());
    else if (x() > 481)
        setPos(481, y());

    if (y() < 0)
        setPos(x(), 0);
    else if (y() > 270)
        setPos(x(), 270);
}
于 2012-10-27T18:33:10.063 に答える
7

このコードは、完全なアイテムをシーンに保持します。アイテムの左上のピクセルだけではありません。

void YourItem::mouseMoveEvent( QGraphicsSceneMouseEvent *event )
{
    QGraphicsItem::mouseMoveEvent(event); 

    if (x() < 0)
    {
        setPos(0, y());
    }
    else if (x() + boundingRect().right() > scene()->width())
    {
        setPos(scene()->width() - boundingRect().width(), y());
    }

    if (y() < 0)
    {
        setPos(x(), 0);
    }
    else if ( y()+ boundingRect().bottom() > scene()->height())
    {
        setPos(x(), scene()->height() - boundingRect().height());
    }
}
于 2014-11-13T09:41:02.077 に答える
5

警告:提案された解決策は、複数選択されたアイテムには機能しません。問題は、その場合、アイテムの 1 つだけがマウス移動イベントを受け取ることです。

実際、QGraphicsItem の Qt ドキュメントには、アイテムの移動をシーン rect に制限するという問題を正確に解決する例が示されています。

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);
}

注 I:QGraphicsItem::ItemSendsScenePositionChangesフラグを有効にする必要があります。

item->setFlags(QGraphicsItem::ItemIsMovable
               | QGraphicsItem::ItemIsSelectable
               | QGraphicsItem::ItemSendsScenePositionChanges);

注 II:終了した動きにのみ反応したい場合は、GraphicsItemChangeフラグの使用を検討してください。ItemPositionHasChanged

于 2017-12-20T13:08:44.690 に答える