Нарисовать границу QGraphicsItem

Как нарисовать границу QGraphicsItem ? Простой painter->drawRect( boundingRect() ) в перегруженном методе рисования неверен (правый нижний угол находится за пределами элемента).


person Dejwi    schedule 08.07.2011    source источник


Ответы (4)


Система координат для графики и рисунков может быть сложной для понимания. Вы часто обнаружите, что программируете тестовые рисунки, чтобы сделать это правильно, но это рисует именно то, что вы говорите ему рисовать. Вам необходимо понимать систему координат. На этой странице обратите особое внимание на изображение "Перо шириной в один пиксель" для QRectF.

person Arnold Spence    schedule 08.07.2011

Обратите внимание, что в документации для QPainter::drawRect() указана фактическая ширина :

Заполненный прямоугольник имеет размер прямоугольника.size(). Обведенный прямоугольник имеет размер прямоугольника.size() плюс ширина пера.

Учитывая это, я полагаю, вам нужно что-то более сложное, чем просто использование ограничивающего прямоугольника:

QRect r = boundingRect();
QPen p = painter->pen();
painter->drawRect(QRect(r.x(), r.y(), r.width()-p.width(), r.height()-p.width()));
person Kaleb Pederson    schedule 08.07.2011

QGraphicsEffect может быть здесь вашим другом. Вы можете подклассировать его, чтобы нарисовать границу вокруг произвольного QGraphicsItem. Просто не забудьте переопределить boundingRectFor(), чтобы включить дополнительную границу.

person Jakub Wieczorek    schedule 08.07.2011

Я узнал свою проблему. Спасибо за все советы, но теперь я вижу, что моя проблема была в другом.

Я могу нарисовать QRectF(), который подходит к boundingRect моего элемента, но... когда я масштабирую свой QGraphicsView (независимо от того, использую ли я метод fitInView() или свою собственную реализацию), возникают некоторые ошибки в отображении моей границы.

Редко одна или две линии прямоугольника бывают более плотными, чем другие. Я думаю, что это может быть связано с моими QGraphicsItem, которые одновременно и QGraphicsSvgItem.

person Dejwi    schedule 09.07.2011