【问题标题】:Color the area defined by Items intersection in Qt为 Qt 中 Items 交集定义的区域着色
【发布时间】:2014-05-23 16:29:04
【问题描述】:

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

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

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

编辑 1: 如果我选择一个实际上位于两个项目形状内的点,则来自 Nejat 的解决方案有效,但如果该点仅属于一个项目或不属于任何项目(我上传了这个案例的一个例子here)。

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

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

【问题讨论】:

    标签: c++ qt overlap qgraphicsitem qgraphicsscene


    【解决方案1】:

    您可以使用返回QPainterPathQGraphicsItem::shape () 来检索项目的形状。对于采取交叉路径,可以使用:

    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() 方法,在该点检索项目列表。然后我可以使用您的解决方案来计算重叠区域。但在最后一种情况下(在编辑 1 图片中)调用 Items(QPoint p) 方法,在红色区域的任何位置使用“p”,将返回一个空列表。你认为我可以使用 QImage 来简单地绘制一些形状吗?
    猜你喜欢
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 2016-11-20
    • 1970-01-01
    相关资源
    最近更新 更多