2010-11-27 17 views
0

QGrahicsRectItem アイテムをitem.width = 10、item.height = 10に設定しているとします。その左上隅は(0,0)にあります。 item.BoundingRect()RectF(0,0,9,9)を返すべきではなく、それはRectF(0,0,10,10)QGraphicsRectItem :: boundingRect()は、1より大きいQRectFを返します

を返す次のコードでそれをテストすることができます。

QGraphicsRectItem* item = new QGraphicsRectItem(0,0,10,10); 
qDebug() << item->boundingRect().width();   // 10, OK 
qDebug() << item->boundingRect().height();   // 10, OK 
qDebug() << item->boundingRect().topLeft().x();  // 0, OK 
qDebug() << item->boundingRect().topLeft().y();  // 0, OK 
qDebug() << item->boundingRect().bottomRight().x(); // 10, WHY? should be 9 
qDebug() << item->boundingRect().bottomRight().y(); // 10, WHY? should be 9 

のでboundingRect()幅が(、11pxの幅と高さを持っているRectFを返します。 )とheight()は両方とも10であると主張しています。

どういうところが間違っていますか?

答えて

0

私はそれに何も間違いはありません。私はそれは、幅と高さ3を持っており、左下隅に[3,3]である

0 1 2 3 
0 |==|==|==| 
    | 1| 2| 3| 
1 |==|==|==| 
    | 1| 2| 3| 
2 |==|==|==| 
    | 1| 2| 3| 
3 |==|==|==| 

(3用10を置き換える)このようにそれを想像し、右のことですか? :)

編集:

Hereあなたは実際に計算していますどのように見ることができます(それは歴史的な理由QRectとQRectFのために別々に計算されますことを、通知を(それが)ドキュメントを主張するものです)。

QRect座標系とQRectF座標系です。

+0

しかし、RectFの幅は11pxで、10ではありません。これは遠近法の問題ではなく、問題を引き起こす事実です。それがポイントです。 boundingRect()を使用して10pxアイテムのマウスイベントを捕捉すると、アイテムから1px離れたイベントも取得されます。 – problemofficer

+0

どういう意味ですか? 11px幅にレンダリングされていますか?デバッグでは10pxの幅があることが明らかになっているためです。したがって、boundingRect()は実際には10ピクセル幅です(この場合はrect()です)。 – Palmik

+0

グラフィックスアイテムにはピクセルではなく連続座標系があります。実際の座標では、0から10までの線の長さは、11ではなく10です。シーンがレンダリングされると、もちろん、アイテムを再度ラスタライズする必要があります。正確なサイズをピクセル単位で予測することはできません。それに頼るべきではありません。 QGraphicsSceneのマウス*イベントハンドラをQGraphicsSceneMouseEventsに渡してみてください。 –

0

ここでは座標を配列と混同していると思います。上記の結果は正しいです。

壁から10メートルの距離をあけて距離を測定する場合は、10メートル先にする必要があります。あなたが最初の一歩を踏む前に壁の中にいることができないからです。それはまた壁が1メートルの厚さであることを意味する。

関連する問題