Вы можете получить местоположение и размер каждого 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.
}
}
Сложнее: если есть пересечение, уберите старый ярлык с дороги.
Возможно, попробуйте следующий алгоритм: переместите метку-нарушителя в сторону, которая требует наименьшего движения. Теперь проверьте это по всем остальным меткам. Любое из покрытых должно быть перемещено в том же направлении. Повторяйте, пока все метки не будут открыты.