我想修改Qt提供的fridge magnets example,当我拖动标签并将其放在另一个标签上时,它会将拖动标签下面的标签推到一边,这样它们就永远不会重叠另一个。
我已经看到如何在colliding mice example中检测到碰撞,它使用QGraphicsScene绘制QGraphicsItem鼠标,并使用scene() - > collidingItems(this)来查看哪些鼠标正在发生碰撞。 / p>
问题是冰箱磁铁示例使用继承QWidget的类来代替QGraphicsScene,因此没有collidingItems()方法来检查我们何时发生碰撞。
我该怎么做?
答案 0 :(得分:2)
您可以从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.
}
}
,这将会更容易。)
{{1}}
更难的部分:如果有交叉点,请将旧标签移开。
也许尝试以下算法:将违规标签移开,使其方向移动最少。现在检查所有其他标签。任何被覆盖的都应该向同一方向移动。重复,直到所有标签都被揭开。