2010-11-27 8 views
0

QGrahicsRectItem이 인 item.width = 10 및 item.height = 10 인 항목이 있다고 가정 해 보겠습니다. 왼쪽 위 모서리는 (0,0)에 있습니다. , 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을 반환

비록 폭 (하십시오 RectF(0,0,10,10)

다음과 같은 코드로 테스트 할 수 있습니다 item.BoundingRect()RectF(0,0,9,9)를 반환해야하지만 대신 반환)와 height()가 모두 10이라고 주장합니다.

무엇이 잘못 되었나요?

답변

0

아무 문제가 없습니다. 그 오른쪽이다

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

지정된 폭 및 높이 (3) 및 왼쪽 하단은 [3,3] 위치에있다했다 (3 (10)을 대체)과 같이 상상? :)

편집 :

Here 당신이 실제로 계산 어떻게 볼 수 있습니다 (이 역사적인 이유로 QRect 및 QRectF 다르게 계산 있다는 통지 (즉) 문서들이 주장하는 것입니다).

QRect 좌표계 및 QRectF 좌표계.

+0

그러나 RectF는 여전히 11px 너비로 10이 아닙니다. 이는 원근법의 문제가 아니라 문제로 이어지는 사실입니다. 그것이 요점입니다. boundingRect()를 사용하여 10px 항목에서 마우스 이벤트를 잡으면 항목에서 1px 떨어진 이벤트도 가져옵니다. – problemofficer

+0

무엇을 의미합니까? 11px 너비로 렌더링됩니까? 디버그에서는 폭이 10px라고 분명하게 말하기 때문에 그래서 boundingRect()는 실제로 10px 넓이입니다 (이 경우 rect()도 마찬가지입니다). – Palmik

+0

그래픽 항목에는 픽셀이 아닌 연속 좌표계가 있습니다. 실제 좌표에서 0에서 10까지가는 선의 길이는 11이 아니라 10입니다. 장면이 렌더링 될 때 물론 항목을 다시 래스터해야하므로 정확한 크기를 픽셀 단위로 예측할 수는 없습니다. 그것에 의지해서는 안됩니다. QGraphicsScene의 마우스 * QGraphicsSceneMouseEvents를 전달하는 이벤트 핸들러를 사용해보십시오. –

0

좌표와 배열을 혼동하는 것 같습니다. 위의 결과는 정확합니다.

벽에서 10m 떨어진 거리를 돌아서 거리를 측정하면 10m 떨어져 있어야합니다. 맞습니까? 9 단계가 아닙니다. 첫 번째 단계를 수행하기 전에 벽 안에있을 수 없기 때문입니다. 그것은 또한 벽이 1 미터 두께라는 것을 의미합니다.