如何跳过被相同的QGraphicsItem遮蔽的QGraphicsItem?

时间:2015-05-18 19:58:20

标签: qt qgraphicsitem qgraphicsscene

我正在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个像素吗?那不会导致奇怪的情况吗?

如何制作被覆盖的物品?

如果一个项目被其他几个项目覆盖,这个问题就更加复杂了,而且这些项目都没有完全覆盖该项目。

1 个答案:

答案 0 :(得分:0)

  

如果我略微增加顶部矩形的大小,isObscured函数可以工作(任一版本)。但是在形状相同的情况下,一个在另一个的顶部,逻辑上底部的一个仍然会被遮挡......

QGraphicsItem::isObscuredBy(QGraphicsItem* item)的文档中,它指出: -

  

基础实现将项目的opaqueArea()映射到此项目的坐标系,然后检查此项目的boundingRect()是否完全包含在映射的形状中

查看不透明区域和映射的形状,这与opaqueArea函数有关,该函数指出: -

  

如果使用不透明的刷子或颜色(即不透明)填充区域,则该区域是不透明的。

有两个相同的项目,它不是被比较的边界矩形的区域,而是QGraphicsItem的opaqueArea与另一个项目的boundingRect。

如果你的两个项目相同时失败,但彼此重叠但颜色不同,那么第一个项目的返回opaqueArea与第二个项目的边界矩形不匹配。