我正在QGraphicsScene
添加项目。添加后,可以进一步处理项目。
我想跳过完全被其他项目遮挡的项目。似乎有几个QGraphicsItems
专门负责这项任务。
给定两个QGraphicsItem
个对象,形状为矩形,大小相同,只是颜色不同,每个都有相同的boundingRect()
,每个都完全相同pos()
,但是使用不同的zValue()
:
for(int i = 0; i < scene.items().size(); ++i)
{
if(scene.items().at(i)->isObscured())
{
continue;
}
// do work
}
我也试过
if(scene->items().at(i)->isObscured(scene->items().at(i)->boundingRect()))
这两个选项都不会跳过不可见的项目。
如果我略微增加顶部矩形的大小,isObscured
函数可以正常工作(任一版本)。但是在形状相同的情况下,一个在另一个的顶部,逻辑上底部的一个仍然会被遮挡......
合理的解决方法是在矩形的每一边添加1个像素吗?那不会导致奇怪的情况吗?
如何制作被覆盖的物品?
如果一个项目被其他几个项目覆盖,这个问题就更加复杂了,而且这些项目都没有完全覆盖该项目。
答案 0 :(得分:0)
如果我略微增加顶部矩形的大小,isObscured函数可以工作(任一版本)。但是在形状相同的情况下,一个在另一个的顶部,逻辑上底部的一个仍然会被遮挡......
在QGraphicsItem::isObscuredBy(QGraphicsItem* item)的文档中,它指出: -
基础实现将项目的opaqueArea()映射到此项目的坐标系,然后检查此项目的boundingRect()是否完全包含在映射的形状中强>
查看不透明区域和映射的形状,这与opaqueArea函数有关,该函数指出: -
如果使用不透明的刷子或颜色(即不透明)填充区域,则该区域是不透明的。
有两个相同的项目,它不是被比较的边界矩形的区域,而是QGraphicsItem的opaqueArea与另一个项目的boundingRect。
如果你的两个项目相同时失败,但彼此重叠但颜色不同,那么第一个项目的返回opaqueArea与第二个项目的边界矩形不匹配。