【问题标题】:Overlapping labels in Qt fridge magnets exampleQt 冰箱磁铁示例中的重叠标签
【发布时间】:2010-02-24 18:31:48
【问题描述】:
我想修改 Qt 提供的fridge magnets example,当我拖动一个标签并将其放在另一个标签上时,它会将拖动标签下方的标签推到一边,因此它们永远不会相互重叠。
我已经看到如何在colliding mice example 中检测到碰撞,它使用 QGraphicsScene 来绘制 QGraphicsItem 鼠标,并使用 scene()->collidingItems(this) 来查看哪些鼠标正在碰撞。
问题在于冰箱磁铁示例使用继承 QWidget 的类代替 QGraphicsScene,因此没有 collidingItems() 方法来检查我们何时发生碰撞。
我该怎么做?
【问题讨论】:
标签:
c++
qt
drag-and-drop
collision-detection
【解决方案1】:
您可以从geometry() 中获取每个QWidget 的位置和大小,它返回一个QRect。 QRect 有函数intersects(),它会告诉你它是否与另一个QRect 相交。放置完成后,遍历所有标签并检查它们是否与新位置相交。
(如果您修改dragwidget 以在拖动小部件上保留每个标签的QList<DragLabel*>,这将更容易。)
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.
}
}
较难的部分:如果有交叉路口,请将旧标签移开。
也许可以尝试以下算法:将违规标签移到移动最少的方向。现在对照所有其他标签检查它。任何被覆盖的东西都应该朝同一方向移动。重复直到发现所有标签。