Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Crazy Sage от Апрель 07, 2015, 10:32



Название: (РЕШЕНО) Проблема с обрезкой QGraphicsItem [Qt4]
Отправлено: Crazy Sage от Апрель 07, 2015, 10:32
Доброго дня. Возникла проблема, никак не могу с ней разобраться. Есть класс унаследованный от QGraphicsItem, который должен отрисовывать окружность (чистый addEllipse не подходит, т.к. есть доп. функционал), ему устанавливаются ширина лини и радиус круга, при отрисовке справа и снизу не перерисовывается несколько пикселей, пока не случится полной перерисовки сцены (на картинке желтое - круг нормально отрисовавшийся при прокрутке QGraphicsView, розовое - та часть, которая перерисовалась при наведении мышки и смене цвета. Центр рисуется отдельным классом, объект которого является дочерним к объекту окружности.

(https://photos-5.dropbox.com/t/2/AABM2kM2bYaXdwPfwSwHpNcG0Kdi38ovcn4kAkQUQzD0UQ/12/25337202/png/1024x768/3/1428397200/0/2/circle.png/CPK6igwgASACIAMoASgC/lkFJ8H6OhPGdWg5HFnBMF4gdVZGH8k7EY2uizzFxtyM)

Изначально думал, что дело в boundingRect, но я расширял его с огромным запасом (+100 пикселей в каждую сторону) и это никак не влияло. Помогите найти, где ошибка (подозреваю, что она тупая и банальная, но не вижу её в упор).

Код класса:
Код:
void CircleItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *item, QWidget *widget)
{
Q_UNUSED(widget);
QPen oldPen=painter->pen();
QPen pen;
pen.setWidth(width_);
if(is_highlighted_)
pen.setColor(highlight_color_);
else
pen.setColor(color_);
painter->setPen(pen);
painter->drawEllipse(-radius_,-radius_,2*radius_+1,2*radius_+1);
painter->setPen(oldPen);
}

QRectF CircleItem::boundingRect() const
{
int offset;
offset = width_;
return QRectF(-radius_-offset,-radius_-offset,2*radius_+offset,2*radius_+offset);
}

QPainterPath CircleItem::shape() const
{
    QPainterPath path;
int offset;
offset = width_;
        path.addEllipse(-radius_-offset,-radius_-offset,2*radius_+offset,2*radius_+offset);
path.addEllipse(-radius_+offset,-radius_+offset,2*radius_-offset,2*radius_-offset);//Два эллипса, чтобы определять наведение мышью только на саму окружность, а не её внутренности
    return path;
}

void CircleItem::setWidth(uint32 width)
{
prepareGeometryChange();
width_ = width;
}

void setRadius(uint32 radius)
{
prepareGeometryChange();
radius_ = radius;
}


Название: Re: Проблема с обрезкой QGraphicsItem [Qt4]
Отправлено: GreatSnake от Апрель 07, 2015, 11:38
Увеличь радиус в shape().


Название: Re: Проблема с обрезкой QGraphicsItem [Qt4]
Отправлено: Crazy Sage от Апрель 07, 2015, 12:23
Ошибка действительно оказалась тупейшая, и из-за этого плохообнаружимая.
Надо было и для ширины и для высоты shape и boundingRect offset умножать на два вместе с радиусом.