在图形场景中如何使重叠的对象透明?
In Graphic scene how to make overlapped object transparent?
在图形视图m设置场景中添加对象(通过拖放),我可以通过鼠标移动这些项目,当我在另一个对象上移动一个对象时,移动的对象应该是透明的。我怎样才能做到?
我不相信你真的想要完全透明,因为它会导致以后无法在视觉上识别透明对象。降低不透明度 - 是。
关于您的问题:场景中的每个项目都有一个边界矩形(或其他类型的边界区域)。您可以通过调用您的项目的 boundingRect()
轻松获得它。返回的 QRectF
具有(就像 QRect
)具有 bool QRect::intersects(const QRect &rectangle) const
函数,它接受另一个矩形并检查是否存在碰撞。
每当您在拖动项目的同时移动鼠标时,您需要遍历场景中的所有项目或所有项目的子集(我所说的子集是指仅特定区域中的项目以提高性能)并检查碰撞。如果检测到碰撞,您可以更改正在拖动的项目或其下方的项目。
当然,要确保一项覆盖另一项,您还需要检查 Z 值。最简单的方法是,如果您将所有当前未被拖动的项目保持在同一 Z 级别,然后,每当您拖动一个项目时,将其 Z 级别增加一个,以便它是 "above" 其他项目。
在图形视图m设置场景中添加对象(通过拖放),我可以通过鼠标移动这些项目,当我在另一个对象上移动一个对象时,移动的对象应该是透明的。我怎样才能做到?
我不相信你真的想要完全透明,因为它会导致以后无法在视觉上识别透明对象。降低不透明度 - 是。
关于您的问题:场景中的每个项目都有一个边界矩形(或其他类型的边界区域)。您可以通过调用您的项目的 boundingRect()
轻松获得它。返回的 QRectF
具有(就像 QRect
)具有 bool QRect::intersects(const QRect &rectangle) const
函数,它接受另一个矩形并检查是否存在碰撞。
每当您在拖动项目的同时移动鼠标时,您需要遍历场景中的所有项目或所有项目的子集(我所说的子集是指仅特定区域中的项目以提高性能)并检查碰撞。如果检测到碰撞,您可以更改正在拖动的项目或其下方的项目。
当然,要确保一项覆盖另一项,您还需要检查 Z 值。最简单的方法是,如果您将所有当前未被拖动的项目保持在同一 Z 级别,然后,每当您拖动一个项目时,将其 Z 级别增加一个,以便它是 "above" 其他项目。