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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [решено] Полилиния  (Прочитано 3493 раз)
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);
    }

Скрины во вложении
« Последнее редактирование: Декабрь 05, 2011, 15:25 от KontAr » Записан
_OLEGator_
Гость
« Ответ #1 : Декабрь 05, 2011, 14:13 »

Видимо неправильно прямоугольную область определяешь.
У QGraphicsItem есть позиция (pos()), а уже относительно ее вычисляется boundingRect().

Например, линия: (10, 10) (10, 20) (20, 20)
pos: (10, 10);
boundingRect: (0, 0, 10, 10);
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Декабрь 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);
}
 
« Последнее редактирование: Декабрь 05, 2011, 15:05 от Igors » Записан
KontAr
Гость
« Ответ #3 : Декабрь 05, 2011, 15:00 »

У QGraphicsItem есть позиция (pos()), а уже относительно ее вычисляется boundingRect().
это я знаю, в моем примере я даже не передвигаю линию. Всего лишь растягиваю за одну из точек, в этом случае pos() неизменен.

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

Может при растягивании линии как-то обновлять boundrect?
Записан
_OLEGator_
Гость
« Ответ #4 : Декабрь 05, 2011, 15:07 »

Попробуйте вызывать после изменения:
Код
C++ (Qt)
void QGraphicsItem::prepareGeometryChange ()
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Декабрь 05, 2011, 15:15 »

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

Видимо о пересчете я и забыл. Олегатор, помогло. Спасибо.
Записан
_OLEGator_
Гость
« Ответ #7 : Декабрь 05, 2011, 15:19 »

Переименуй свой первый пост и добавь [РЕШЕНО]
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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