2010-11-27 15 views
0

Angenommen, ich habe ein QGrahicsRectItem Element mit item.width = 10 und item.height = 10. Die obere linke Ecke ist bei (0,0). item.BoundingRect() sollte ein RectF(0,0,9,9) zurückkehren, sondern es gibt eine RectF(0,0,10,10)QGraphicsRectItem :: boundingRect() gibt einen QRectF ein, der 1px größer ist als er sein sollte

Sie können es mit dem folgenden Code testen:

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 

So boundingRect() gibt einen RectF, die eine Breite und Höhe von 11px hat, obwohl Breite () und Höhe() behaupten, es ist 10 für beide.

Was ist los?

Antwort

0

Ich sehe nichts falsch damit. Ich stelle mir das so (ersetzen 10 für 3)

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

Es hat Breite und Höhe 3 und die untere linke Ecke auf [3,3], ist das richtig? :)

Edit:

Here Sie können sehen, wie es tatsächlich berechnet ist (man beachte, dass es aus historischen Gründen für QRect und QRectF anders berechnet ist (das ist, was docs behaupten)).

Das Koordinatensystem QRect und das Koordinatensystem QRectF.

+0

Aber immer noch ist das RectF 11px breit und nicht 10. Das ist keine Frage der Perspektive, sondern eine Tatsache, die zu Problemen führt. Das ist der Punkt. Wenn ich motioningRect() verwende, um Mausereignisse in meinen 10px-Elementen abzufangen, erhalte ich auch Ereignisse, die 1px vom Objekt entfernt sind. – problemofficer

+0

Was meinst du? Ist es 11px breit gerendert? Weil das Debugger eindeutig sagt, dass es 10 px breit ist. Also ist die boundingRect() wirklich 10px breit (und in diesem Fall ist es auch rect()). – Palmik

+0

Ein Grafikelement hat ein fortlaufendes Koordinatensystem, keine Pixel. In realen Koordinaten ist die Länge der Linie, die von 0 bis 10 geht, 10, nicht 11. Wenn die Szene gerendert wird, müssen die Objekte natürlich erneut gerastert werden, so dass Sie die genaue Größe in Pixeln nicht vorhersagen können sollte sich nicht darauf verlassen. Versuchen Sie, die * Event-Handler von QGraphicsScene mit QGraphicsSceneMouseEvents zu verwenden. –

0

Ich denke, dass Sie hier Koordinaten mit Arrays verwechseln. Die obigen Ergebnisse sind korrekt.

Wenn Sie 10 Meter von einer Wand entfernt sind und sich umdrehen, um die Entfernung zu messen, sollten Sie 10 Meter entfernt sein, richtig? Nicht 9 - weil Sie nicht in der Wand sein können, bevor Sie den ersten Schritt machen. Das würde auch bedeuten, dass die Wand 1 Meter dick ist.