在Qt冰箱磁铁示例中重叠标签

时间:2010-02-24 18:31:49

标签: c++ qt drag-and-drop collision-detection

我想修改Qt提供的fridge magnets example,当我拖动标签并将其放在另一个标签上时,它会将拖动标签下面的标签推到一边,这样它们就永远不会重叠另一个。

我已经看到如何在colliding mice example中检测到碰撞,它使用QGraphicsScene绘制QGraphicsItem鼠标,并使用scene() - > collidingItems(this)来查看哪些鼠标正在发生碰撞。 / p>

问题是冰箱磁铁示例使用继承QWidget的类来代替QGraphicsScene,因此没有collidingItems()方法来检查我们何时发生碰撞。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

您可以从QWidget获取每个geometry()的位置和尺寸,该QRect会返回QRectintersects()具有函数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}}

更难的部分:如果有交叉点,请将旧标签移开。

也许尝试以下算法:将违规标签移开,使其方向移动最少。现在检查所有其他标签。任何被覆盖的都应该向同一方向移动。重复,直到所有标签都被揭开。