Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Nidxogg от Октябрь 16, 2013, 23:12



Название: boundingRect для непрямоугольной фигуры
Отправлено: Nidxogg от Октябрь 16, 2013, 23:12
Требуется нарисовать ломанную линию  (стрелка)
Собственно, наследуюсь от QGraphicsItem. Переоопределяю вирт.методы Paint и boundingRect
Вот только boundingRect возвращает прямоугольную область, а хотелось бы что-то подобное на очертание стрелки.


Вроде читал, что можно также переопределить метод shape(), только не понято как его привязать к boundingRect


Название: Re: boundingRect для непрямоугольной фигуры
Отправлено: mutineer от Октябрь 17, 2013, 09:15
Попробуй QRegion QGraphicsItem::boundingRegion


Название: Re: boundingRect для непрямоугольной фигуры
Отправлено: Fregloin от Октябрь 17, 2013, 10:16
В любом случае вам придётся переопределять этот метод. будь это эллипс или сложный полигон.
У меня таких объектов много.

Как делать.

Код:
QPainterPath YourClass::shape() const
{
QPainterPath path;
path.addPolygon(somePolygon1);
path.addPolygon(somePolygon2);
...
path.addRect(rect1);
path.addEllipse(...);
return path;
}

QRectF YourClass::boundingRect() const
{
return shape().boundingRect().simplified(); //для убирания наложения полигонов и прочих объектов
}

Еще есть такой нюанс, который я выяснил довольно позлно, что если нужно объеденить несколько полигонов и получить в результате их суммирующую форму, то простое добавление к path не поможет, так как по сути path будет состоять из продолжающихся полигонов друг за другом, что в конечном итоге не то что надо, тогда следует делать так
Код:
QPainterPath path;
path.addPolygon(poly1);
QPainterPath path2;
path2.addPolygon(poly2);
path |= path2;
return path;

Такой код даст правильный резултат наложения нескольких фигур друг на друга без "дырок" в областях наложения.


Название: Re: boundingRect для непрямоугольной фигуры
Отправлено: Nidxogg от Октябрь 18, 2013, 17:32
Все сделал, спасибо.