2012-01-25 6 views
3

QGraphicsSceneにQGraphicsRectItemアイテムがあります。 商品は可動であり、親なしです。作品QGraphicsItemは、シーン内の間違った位置を返します。 (Qt4.7.3)

item = new QGraphicsRectItem (rect); 

を: 私は項目がファイルから位置を読み取り、コンストラクタを呼び出す置きます。位置は意図通りです。ない場面での絶対的な位置 -

それから私は、位置が間違っている

item->pos().toPoint() 

を使用してアイテムからそれを取得することにより、ファイルに戻って位置を保存してみてください。位置は、アイテムが作成された最後の位置を基準にしています。

pos()は、シーン内のアイテムの位置を取得するための正しい方法ですか?

ありがとうございました!

P.S: scenePos()と同じ値が

答えて

5

QGraphicsRectItemにも問題がありました。

「設定する/取得する」rectはアイテムの「pos」に相対的なものなので、どちらか一方(または混乱させたい場合は両方)を使用して場所を制御できますジオメトリが実際に描画されます。私は両方の使用するためのヒントにウェブを探していたので、私はあなたの質問を見つけた

// Given QRectF scene_rect that represents the rectangle I want drawn... 
setPos(scene_rect.topLeft()); // Set the item's "position" relative to the scene 
scene_rect.moveTo(0.0, 0.0); // ...then set the rectangle's location to (0,0) 
setRect(scene_rect);   // ...so the rectangle is drawn at (0,0) relative to the item 
1

今は回避策を見つけた返します。それがQtのバグかシーン/ビューでの私の誤解であれば結び付けないでください。

ここでは、0,0の位置にアイテムを作成し、moveBy(x、y)を使用してアイテムを目的の位置に移動します。

item = new QGraphicsRectItem(QRect(QPoint(x,y),QSize(w,h))); 
QPoint p = item->pos().toPoint(); //WRONG position! Relative to x,y 

item = new QGraphicsRectItem(QRect(QPoint(0,0),QSize(w,h))); 
item->moveBy(x,y); 
QPoint p = item->pos().toPoint(); //Right position! Relative to 0,0 of scene 

何となく、奇妙です。

3

私のソリューションは、このでした。

私はQtの4.7.4のソースを見ていた:

  • QGraphicsRectItemPrivateは、あなたが(RECTで取得)とsetRect(で変更することができますメンバーQRectF rectを持っています)。
  • しかし、QGraphicsItemに由来するので、QRectF posもあります。
  • 関数boundingRect()は、rectをペンの幅で調整して返します。これは、更新する領域が一般的に正しいことを意味します。

したがって、aldoが述べたように、rect.topLeftまたはposを位置合わせに使用するかどうかを判断する必要があります。あなたは一回の関数コールでQGraphicsRectItemの位置とサイズを定義することができます

  • :RECTを使用しての

    長所:あなたと他の人はここで、決定に役立つ
    は、いくつかのプロとコントラポイントです。

  • QGraphicsLineItemの場合、pos()関数は常にboundingRectのtopLeftコーナーを指します。これはラインポイントの1つである必要はないため、posをQPointF(0,0)、QLineポイントは常にシーンに関連しています。 RECTを使用しての

欠点:

  • あなたはsetPosを(使用できないため)、QGraphicsItem::ItemPositionChangeを発する機能はありません。私には、QGraphicsLineItemを使用していない限り、この点は利点よりも重視されます(QGraphicsLineItemが必要な場合は、QGraphicsItem :: ItemPositionChangeを自分で送信してください)。
  • 方法との両方を使用することが

あなたは両方のposとRECTを使用する場合は、posがあなたのGraphicsItemの中心とします。
グラフィックスシーンの特定の半径を持つマーカー、カーソルなどを想像してください。あなたはそのためのQGraphicsRectItemを使用したい場合は、私がお勧め:

QPointF markerpos = GetMarkerPos(); 
double r = GetMarkerRadius(); 
QRectF markerrect(-r, -r, +r * 2., +r * 2.); // topleft: -radius, size: 2*radius 
setPos(markerpos); 
setRect(markerrect); 

この方法は、posが常に中央を指すと矩形は、半径のみによって定義されます。

+0

説明ありがとうございます –

+0

問題の非常に包括的な説明。 +1 – Alex

関連する問題