C++ 为Qt中项目交叉点定义的区域着色

C++ 为Qt中项目交叉点定义的区域着色,c++,qt,overlap,qgraphicsitem,qgraphicsscene,C++,Qt,Overlap,Qgraphicsitem,Qgraphicsscene,我在qgraphicscene的QGraphicsView中有一些自定义的qgraphicssitems。使用items(QPoint(x,y))方法,我检索给定场景点的所有项目。 绘制这些项目后,它们将不会移动、旋转或缩放,因此它们的形状不会改变 我想知道是否有办法只改变重叠区域的颜色(当然,如果我至少有两个项目) 另一种写问题的方式是:给定一个起点,给场景上色,直到找到一些边界。 我没有足够的声誉来发布图片,所以我上传了三个期望结果的例子 编辑1:如果我选择了一个实际位于两个项目形状内的点,

我在
qgraphicscene
QGraphicsView
中有一些自定义的
qgraphicssitems
。使用
items(QPoint(x,y))
方法,我检索给定场景点的所有项目。
绘制这些项目后,它们将不会移动、旋转或缩放,因此它们的形状不会改变

我想知道是否有办法只改变重叠区域的颜色(当然,如果我至少有两个项目)

另一种写问题的方式是:给定一个起点,给场景上色,直到找到一些边界。
我没有足够的声誉来发布图片,所以我上传了三个期望结果的例子

编辑1:如果我选择了一个实际位于两个项目形状内的点,Nejat的解决方案会起作用,但如果该点只属于一个项目或不属于任何项目,则不起作用(我上传了一个示例)

也许我应该用另一种方法?一旦绘制,我不需要更改项目,因此我也会对“平面/静态”面向像素的解决方案感兴趣。我可以使用
QImage
class吗


编辑2:Nejat的回答对原始问题是正确的。顺便说一句,出于我的目的,我使用了一个
QImage
,在其上绘制所有形状,最后使用“整体填充”算法填充我想要的区域。

您可以使用
QGraphicsItem::shape
()返回
QPainterPath
来检索项目的形状。对于采用交叉点路径,可使用以下方法:

QPainterPath QPainterPath::intersected ( const QPainterPath & p ) const;
因此,您可以获得两个项目的相交路径,如:

QPainterPath intersectedPath = item1->shape()->intersected(item2->shape());
现在,可以通过以下方式填充相交区域:

painter->setBrush(QColor(122, 163, 39));
painter->drawPath(intersectedPath);

由于我的描述中缺少信息,此解决方案部分有效。我在“编辑1”中添加了新信息。在这个解决方案中,不需要点。您可以检索相交区域并用画笔绘制它。我使用起点对其调用Items()方法,在该点检索项目列表。然后我可以用你的解来计算重叠面积。但是在最后一种情况下(在Edit 1 picture中),调用
Items(QPoint p)
方法,在红色区域的任意位置使用“p”,将返回一个空列表。你认为我可以用一个QImage来简单地画一些形状吗?