Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: KontAr от Декабрь 05, 2011, 13:32



Название: [решено] Полилиния
Отправлено: KontAr от Декабрь 05, 2011, 13:32
вопрос по полилинии. Наследовал ее от QGraphicsItem. Основой стал вектор точек. В конструкторе записал туда несколько точек, которые прекрасно отрисовались (11). Потом за маркер я вытягиваю линию (12). А вот дальше ерунда: при выделении, если руббербанд за пределами первоначальной линии (boundrect'a), то последняя просто стирается (13), если нет, то выделится (14, 12).  Что не так?

Код:
    QRectF boundingRect() const
    {
        qreal lx, rx, by, ty;
              lx =rx =by =ty =0;
        for(int i = 0; i < points.count() - 1; i++)
        {
            lx = qMin(lx, points[i].x());
            rx = qMax(rx, points[i].x());
            ty = qMax(ty, points[i].y());
            by = qMin(by, points[i].y());
        }
        return QRectF(lx, by, rx - lx, ty - by);
    }

Скрины во вложении


Название: Re: Полилиния
Отправлено: _OLEGator_ от Декабрь 05, 2011, 14:13
Видимо неправильно прямоугольную область определяешь.
У QGraphicsItem есть позиция (pos()), а уже относительно ее вычисляется boundingRect().

Например, линия: (10, 10) (10, 20) (20, 20)
pos: (10, 10);
boundingRect: (0, 0, 10, 10);


Название: Re: Полилиния
Отправлено: Igors от Декабрь 05, 2011, 14:42
Код
C++ (Qt)
inline QPointF MinPt( const QPointF & p1, const QPointF & p2 )
{
return QPointF(qMin(p1.x(), p2.x()), qMin(p1.y(), p2.y()));
}
 
inline QPointF MaxPt( const QPointF & p1, const QPointF & p2 )
{
return QPointF(qMax(p1.x(), p2.x()), qMax(p1.y(), p2.y()));
}
 
QRectF boundingRect() const
{
 int i, limit = points.count();
 if (!limit) return QRectF();
 
 QPointF lt, rb;
 LT = RB = points[0];
 for (i = 1; i < limit; ++i) {
   lt = MinPt(lt, points[i]);
   rb = MaxPt(rb, points[i]);
 }
 
 return QRectF(lt, rb);
}
 


Название: Re: Полилиния
Отправлено: KontAr от Декабрь 05, 2011, 15:00
У QGraphicsItem есть позиция (pos()), а уже относительно ее вычисляется boundingRect().
это я знаю, в моем примере я даже не передвигаю линию. Всего лишь растягиваю за одну из точек, в этом случае pos() неизменен.

Igors, с Вашим кодом то же самое, что у меня на скринах.

Может при растягивании линии как-то обновлять boundrect?


Название: Re: Полилиния
Отправлено: _OLEGator_ от Декабрь 05, 2011, 15:07
Попробуйте вызывать после изменения:
Код
C++ (Qt)
void QGraphicsItem::prepareGeometryChange ()


Название: Re: Полилиния
Отправлено: Igors от Декабрь 05, 2011, 15:15
Может при растягивании линии как-то обновлять boundrect?
Ну если хоть 1 точка изменилась - bounding box тоже, пересчет должен быть, это само собой. Или может Вы о другом, и я не понял проблемы ?


Название: Re: Полилиния
Отправлено: KontAr от Декабрь 05, 2011, 15:17
Видимо о пересчете я и забыл. Олегатор, помогло. Спасибо.


Название: Re: Полилиния
Отправлено: _OLEGator_ от Декабрь 05, 2011, 15:19
Переименуй свой первый пост и добавь [РЕШЕНО]