QGraphicsRectItem::boundingRect() возвращает QRectF, который на 1 пиксель больше, чем должен быть

Допустим, у меня есть QGraphicsRectItem item с item.width=10 и item.height=10. Его верхний левый угол находится в (0,0). item.BoundingRect() должен возвращать RectF(0,0,9,9), но вместо этого возвращает RectF(0,0,10,10)

Вы можете протестировать его с помощью следующего кода:

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() возвращает RectF, который имеет ширину и высоту 11 пикселей, хотя width() и height() утверждают, что они равны 10 для обоих.

Что не так?


person problemofficer    schedule 27.11.2010    source источник


Ответы (2)


Я думаю, вы путаете координаты с массивами здесь. Приведенные выше результаты верны.

Если вы отступите на 10 метров от стены и повернетесь, чтобы измерить расстояние, вы должны быть на расстоянии 10 метров, верно? Не 9 — потому что нельзя оказаться внутри стены, пока не сделаешь первый шаг. Это также означает, что стена имеет толщину 1 метр.

person BastiBen    schedule 27.11.2010

Я не вижу в этом ничего плохого. Я себе это так представляю (заменить 10 на 3)

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

Его ширина и высота равны 3, а нижний левый угол находится в точке [3,3], верно? :)

Редактировать:

Здесь вы можете увидеть, как это на самом деле вычисляется (обратите внимание, что он вычисляется по-разному для QRect и QRectF по историческим причинам (это то, что утверждает документация)).

Система координат QRect и QRectF система координат.

person Palmik    schedule 27.11.2010
comment
Но все же RectF имеет ширину 11 пикселей, а не 10. Это не вопрос перспективы, а факт, который приводит к проблемам. В этом-то и дело. Если я использую boundingRect() для перехвата событий мыши в моих 10-пиксельных элементах, я также буду получать события, которые находятся на расстоянии 1 пикселя от элемента. - person problemofficer; 28.11.2010
comment
Что ты имеешь в виду? Он отображается шириной 11 пикселей? Потому что в отладке ясно сказано, что он шириной 10 пикселей. Таким образом, boundingRect() действительно имеет ширину 10 пикселей (и в этом случае rect()). - person Palmik; 28.11.2010
comment
Графический элемент имеет непрерывную систему координат, а не пиксели. В реальных координатах длина строки, которая идет от 0 до 10, равна 10, а не 11. Когда сцена визуализируется, элементы, конечно, нужно снова растрировать, поэтому вы не можете предсказать точный размер в пикселях, и не следует полагаться на это. Попробуйте использовать обработчики событий mouse*Event QGraphicsScene, передающие QGraphicsSceneMouseEvents. - person Frank Osterfeld; 28.11.2010
comment
Конкретный случай заключается в том, что я использую boundingRect(), чтобы проверить, находится ли moveMouseEvent внутри объекта, потому что он получает события, даже когда вы находитесь вне объекта. Эта проверка завершается неудачно, потому что для одного пикселя курсор находится вне объекта, но внутри boundingRect(). Поскольку я обращаюсь к QList, используя координаты курсора, это приводит к ошибкам вне границ. Итак, здесь boundingRect() не представляет фактический элемент. Это проблема. - person problemofficer; 28.11.2010
comment
@problemofficer Я знаю, что этот вопрос старый, но если вы столкнулись с чувствительностью мыши на 1 пиксель выше и слева от элемента, это связано с ошибкой в ​​Qt (версия ‹ = 4.8, я полагаю). см. здесь... - person Martin Hennings; 30.07.2013