Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Ground от Май 16, 2015, 18:08



Название: Перемещение QGraphicsItem по сцене без пересечений
Отправлено: Ground от Май 16, 2015, 18:08
Добрый день!
Мне нужно на сцене перемещать мышью QGraphicsRectItem. Причем перемещать так, чтобы они не пересекались.
Я переопределил mouseMoveEvent в QGraphicsRectItem, но события о движении мыши приходят рывками, т.е. может быть так, что в первом событии, координата мыши (1, 1), а во втором уже (10, 10).

Код
C++ (Qt)
void GraphicsRectItem::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
{
   qDebug()<<event->scenePos()<<event->lastScenePos();
 
   QGraphicsRectItem* item;
 
   foreach (item, mItems)
   {
       if (this == item)
           continue;
 
       if (collidesWithItem(item, Qt::IntersectsItemBoundingRect))
       {
           event->accept();
           return;
       }
   }
 
   QGraphicsRectItem::mouseMoveEvent(event);
}
 

И получается следующая ситуация (на картинке):

(http://habrastorage.org/files/5b2/3be/b6c/5b23beb6c3dc444f9dc5e93bdab61dff.png)

Как сделать так, чтобы при движении мыши, двигаемый QGraphicsRectItem не пересекал никакой другой Item? Чтобы останавливался у его границы?


Название: Re: Перемещение QGraphicsItem по сцене без пересечений
Отправлено: Igors от Май 17, 2015, 05:11
может быть так, что в первом событии, координата мыши (1, 1), а во втором уже (10, 10).
Напрашивается интерполировать, напр есть пересечение в (10, 10) - попробовать поставить айтем в позицию (5, 5) и.т.д. Когда нашли лучшую точку по диагонали пытаемся улучшить по х, затем по y. Др словами найти ближайшую (к текущей позиции мыши) валидную точку. Только делать это надо до того как движение состоялось


Название: Re: Перемещение QGraphicsItem по сцене без пересечений
Отправлено: Bepec от Май 17, 2015, 13:30
у вас скорее что то с программой. MouseMove приходит на каждую координату. Если она прыгает, то значит у вас программа подтормаживает.

PS хотя такая ситуация может быть и с планшетом, но тут уж извратиться надо :)