2011-08-10 11 views
0

こんにちは、読んでいただきありがとうございます。 QGraphicsViewでマウスをドラッグしている間、複数のQGraphicsItemsの位置を正しく量子化するのに問題があります。私が設定したシステムは、複数の選択してドラッグした場合は、主要な項目(マウスの直下の項目)のみが量子化され、残りの部分は連続的に設定されていますが、QGraphicsItemを正しくドラッグするとQGraphicsItemが正しく量子化されます。私はこのことについて何か助けていただければ幸いです。関連するコードは次のとおりです。QGraphicsViewでマウスをドラッグしながら複数の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); 
} 

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

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

すべてのヘルプははるかに高く評価されるだろう!

答えて

0

保護された機能QGraphicsItem::itemChangeを上書きしてみてください。そこからアイテムの位置が変更されようとしているときに通知を受け(QGraphicsItem::ItemPositionChange)、値を変更する機会があります。このメソッドは、変更が開始されたかに関係なく(マウス移動、コードに設定されたグループの一部など)

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

0

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

正常に動作させたい場合は、独自のマウスイベント処理を実装する必要があります(そして、MutaEvent :: mouseMoveEventのsetPos(pos())を呼び出しても効果はありません)。

関連する問題