gpt4 book ai didi

c++ - Qt 冰箱磁铁示例中的重叠标签

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:56 26 4
gpt4 key购买 nike

我想修改 fridge magnets example Qt 以一种方式提供,当我将一个标签拖放到另一个标签上时,它会将被拖动标签下方的标签推到一边,因此它们永远不会相互重叠。

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

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

我该怎么做?

最佳答案

可以得到每个QWidget的位置和大小来自 geometry() ,它返回一个 QRect . QRect具有功能intersects() , 它会告诉你它是否与另一个 QRect 相交.放置完成后,遍历所有标签并检查它们是否与新位置相交。

(如果您修改 dragwidget 以保留 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.
}
}

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

也许可以尝试以下算法:将违规标签移到移动最少的方向。现在对照所有其他标签检查它。任何被涵盖的内容都应朝相同的方向移动。重复直到所有标签都被揭开。

关于c++ - Qt 冰箱磁铁示例中的重叠标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2328486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com