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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема c отрисовкой QGraphicsItem'ов  (Прочитано 3399 раз)
Crazy Sage
Гость
« : Июль 03, 2015, 12:19 »

Добрый день, возникла проблема, не могу сообразить в какую сторону вообще копать. Есть унаследованные от QGraphicsItem объект представляющий отрезок и объект представляющий ломаную, который просто состоит из набора дочерних отрезков. Периодически (не у всех объектов и не при всех размерах) часть отрезков просто не отрисовывается, хотя вход в функцию выполняется и если объект выбран, то "муравьи" вокруг него частично отрисовываются (только черным цветом, белый не отрисовывается). На скриншотах как раз в одном случае объект не выбран, в другом объект выбран и по "муравьям" видно, куда должна продолжаться синяя линия. Версия Qt 4.4.2

Проблема никогда не возникает с самостоятельными отрезками и происходит только с крайними (первыми или последними) отрезками ломаной.

Код отрисовки отрезка
Код:
void LineItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *item, QWidget *widget)
{
  Q_UNUSED(widget);
  painter->setClipRect( item->exposedRect );
  QPen oldPen = painter->pen();
  if (is_selected_) {
    QPen dash_pen_background;
    dash_pen_background.setColor(Qt::white);
    dash_pen_background.setWidth(width_);
    QPen dash_pen;
    dash_pen.setColor(Qt::black);
    dash_pen.setWidth(width_);
    dash_pen.setDashOffset(dash_offset_);
    dash_pen.setDashPattern(dash_pattern_);
    int offset;
    if (is_highlighted_) {
      offset = width_;
    } else {
      offset = width_/2;
    }
    painter->setPen(dash_pen_background);
    if (boundingRect().width() >= boundingRect().height()) {
      painter->drawLine(start_.x(), start_.y() - offset,
                        finish_.x(), finish_.y() - offset);
      painter->drawLine(finish_.x(), finish_.y() + offset,
                        start_.x(), start_.y() + offset);
      painter->setPen(dash_pen);
      painter->drawLine(start_.x(), start_.y() - offset,
                        finish_.x(), finish_.y() - offset);
      painter->drawLine(finish_.x(), finish_.y() + offset,
                        start_.x(), start_.y() + offset);
    } else {
      // полностью аналогичный предыдущему блоку код, только смещение по x, а не по y.
    }
  }
  QPen pen;
  pen.setColor(color_);
  pen.setWidth(width_);
  painter->setPen(pen);
  painter->drawLine(start_,finish_);
  painter->setPen(oldPen);
}
« Последнее редактирование: Июль 03, 2015, 12:22 от Crazy Sage » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Июль 06, 2015, 15:12 »

а если boundingRect увеличить на пару пикселей?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Июль 14, 2015, 23:34 »

Crazy Sage

Линии не отрисовываются полностью по двум возможным причинам:

1) boundingRect или shape меньше, чем ширина линии. Всё, что выступает - обрезается, в том числе, и выступающие за shape края линий. То есть, если линия шириной 3 пиксела нарисована по краю объекта, а его shape совпадает с центральными пикселами этой линии, то будет видна только часть линии шириной 2 пиксела.
2) Если объект или вьюпорт масштабируется афинными преобразованиями, то меняется толщина линий, если только она задана не равной 0 (если задана равной 0, толщина всегда 1 пиксел, независимо от масштаба), и при уменьшении масштаба линии будут вообще пропадать. Это вот довольно гнусно - хотелось бы иметь установку масштаба, меньше которого линии не должны уменьшаться и пропадать. Но простой способ сделать это, без наследования айтемов, не просматривается.
Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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