0

こんにちは、読んでくれてありがとう。QGraphicsViewでマウスをドラッグしているときに、複数のQGraphicsItemの位置を正しく量子化するのに問題があります。私がセットアップしたシステムは、一度に1つだけドラッグすると、QGraphicsItemを正しく量子化しますが、複数選択してドラッグすると、プライマリアイテム(マウスの真下にあるもの)のみが量子化され、残りのアイテムの位置は継続的に設定されます。私はこれでどんな助けでも大いに感謝します。関連するコードは次のとおりです。

これは、QGraphicsRectItemから継承するMutaEventと呼ばれるクラスにあります。mouseMoveEvent()関数とsetPos()関数を再定義しました。

void MutaEvent::mouseMoveEvent( QGraphicsSceneMouseEvent * event )
{
    QGraphicsRectItem::mouseMoveEvent(event);
    setPos(pos());
}

void MutaEvent::setPos(const QPointF &pos)
{
    QGraphicsRectItem::setPos(Muta::quantizePointD(pos,30,15));
    emit posChanged(objectID,pos);
}

次のビットは、Mutaと呼ばれる名前空間の静的関数です。

static QPointF quantizePoint(QPointF point,double xQuant, double yQuant)
{
    double x = quantize(point.x(),xQuant);
    double y = quantize(point.y(),yQuant);
    QPointF quantPoint(x,y);
    return quantPoint;
}

どんな助けでも大歓迎です!

4

2 に答える 2

0

選択したすべてのアイテムはMutaEventクラスですか?setPos()は、選択された各アイテムで呼び出されるため、そうでない場合は、デフォルトの実装を使用します。

正しく機能させるには、独自のマウスイベント処理を実装する必要がある場合があります(ちなみに、MutaEvent :: mouseMoveEventでsetPos(pos())を呼び出しても効果はありません)。

于 2011-08-10T21:16:55.923 に答える
0

QGraphicsItem::itemChange保護された関数のオーバーライドを見てください。そこから、アイテムの位置が変更されようとしているときに通知され ( QGraphicsItem::ItemPositionChange)、値を変更する機会が得られます。このメソッドは、変更が開始された方法 (マウスの移動、グループの一部、コードでの設定など) に関係なく呼び出されます。

あなたの問題の一部は仮想でQGraphicsItem::setPos()ないsetPos()ことだと思います。つまり、呼び出し元があなたのインスタンスをMutaEvent*として扱っている場合、あなたの関数は呼び出されませんQGraphicsItem*MutaEventもちろん、彼らはあなたのクラスの知識を持っていないので、これはQtフレームワークのどこにでも当てはまります。itemChangeこれが、仮想メソッドを提供する理由です。

于 2011-08-11T12:43:33.283 に答える