Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Crazy Sage от Июль 03, 2015, 12:19



Название: Проблема c отрисовкой QGraphicsItem'ов
Отправлено: 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);
}


Название: Re: Проблема c отрисовкой QGraphicsItem'ов
Отправлено: Racheengel от Июль 06, 2015, 15:12
а если boundingRect увеличить на пару пикселей?


Название: Re: Проблема c отрисовкой QGraphicsItem'ов
Отправлено: Гурман от Июль 14, 2015, 23:34
Crazy Sage

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

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