Перекрывающиеся метки в примере с магнитами на холодильник Qt - PullRequest
2 голосов
/ 24 февраля 2010

Я хочу изменить пример магнитов на холодильник , предоставляемых с Qt, таким образом, что когда я перетаскиваю метку и перетаскиваю ее на другую, она смещает метку под перетаскиваемой меткой в ​​сторону, чтобы они никогда не будут перекрывать друг друга.

Я видел, как обнаруживается столкновение в примере сталкивающихся мышей , где он использует QGraphicsScene для рисования мышей QGraphicsItem, и scene () -> collidingItems (this), чтобы увидеть, какие мыши являются встречные.

Проблема в том, что в примере с магнитами на холодильник вместо QGraphicsScene используется класс, который наследует QWidget, поэтому нет метода collidingItems (), который можно было бы проверить при столкновении.

Как мне это сделать?

1 Ответ

2 голосов
/ 24 февраля 2010

Вы можете получить местоположение и размер каждого QWidget из geometry(), который возвращает QRect. QRect имеет функцию intersects(), которая сообщит вам, пересекает ли она другую QRect. После завершения отбрасывания переберите все метки и проверьте, пересекает ли какая-либо из них новую позицию.

(Это будет проще, если вы измените dragwidget, чтобы сохранить QList<DragLabel*> каждой метки на dragwidget.)

QRect droppedRect = newLabel->geometry();
foreach(DragLabel* label, dragLabelList)
{
  if (droppedRect.intersects(label->geometry())
  {
    // Add to the list of covered labels that need to be moved.
  }
}

Сложнее: если есть пересечение, уберите старый ярлык с дороги.

Возможно, попробуйте следующий алгоритм: переместите метку-нарушителя в сторону, которая требует наименьшего движения. Теперь проверьте это по всем остальным меткам. Любое из покрытых должно быть перемещено в том же направлении. Повторяйте, пока все метки не будут открыты.

...