Russian Qt Forum
Ноябрь 01, 2024, 04:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: (РЕШЕНО) Проблема с обрезкой QGraphicsItem [Qt4]  (Прочитано 3046 раз)
Crazy Sage
Гость
« : Апрель 07, 2015, 10:32 »

Доброго дня. Возникла проблема, никак не могу с ней разобраться. Есть класс унаследованный от QGraphicsItem, который должен отрисовывать окружность (чистый addEllipse не подходит, т.к. есть доп. функционал), ему устанавливаются ширина лини и радиус круга, при отрисовке справа и снизу не перерисовывается несколько пикселей, пока не случится полной перерисовки сцены (на картинке желтое - круг нормально отрисовавшийся при прокрутке QGraphicsView, розовое - та часть, которая перерисовалась при наведении мышки и смене цвета. Центр рисуется отдельным классом, объект которого является дочерним к объекту окружности.



Изначально думал, что дело в 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;
}
« Последнее редактирование: Апрель 07, 2015, 12:23 от Crazy Sage » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Апрель 07, 2015, 11:38 »

Увеличь радиус в shape().
Записан

Qt 5.11/4.8.7 (X11/Win)
Crazy Sage
Гость
« Ответ #2 : Апрель 07, 2015, 12:23 »

Ошибка действительно оказалась тупейшая, и из-за этого плохообнаружимая.
Надо было и для ширины и для высоты shape и boundingRect offset умножать на два вместе с радиусом.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.056 секунд. Запросов: 22.