【问题标题】: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 的位置和大小,它返回一个QRectQRect 有函数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.
      }
    }
    

    较难的部分:如果有交叉路口,请将旧标签移开。

    也许可以尝试以下算法:将违规标签移到移动最少的方向。现在对照所有其他标签检查它。任何被覆盖的东西都应该朝同一方向移动。重复直到发现所有标签。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      • 2019-12-07
      • 2022-01-03
      • 2021-12-31
      • 2020-02-06
      • 1970-01-01
      相关资源
      最近更新 更多