cairo_push_group Qt 中的模拟:"clear" 组合模式清除其下的所有内容

cairo_push_group analog in Qt: "clear" composition mode clears everything underneath it

我正在使用 QPainter 编写一个应用程序,我需要 QPainter class 中的 cairo_push_group 的模拟来绘制,比如说,其中有一堆孔的矩形,这些孔可能相交。

问题是当我用"clear"组合模式画洞时,我画的洞下面的所有东西都被清除了;我希望在开始绘制复杂形状之前位于孔下方的图像保留下来。换句话说 - 洞下面的所有东西都被清除了,而我只是想让蜜蜂看到洞下面的所有东西。

一个解决方案似乎是使用 QPainterPath 和奇数填充选项(默认选项),但这不适合我,因为在我的应用程序中,孔可能相交,这样两个孔就赢了'合并(两个孔的交集不是孔)

另一种解决方案是只使用 QPainterPath::subtracted 方法,但由于某种原因它会降低多边形的质量(例如,圆形变成具有可数边的形状)。

另一种方法是将我正在绘制的QImage保存到一个临时的QImage,清除它,绘制我需要的所有内容,然后使用"destination over"模式绘制它再次,但这似乎是一个非常缓慢且耗费内存的解决方案。

这个问题还有其他解决办法吗?也许 Qt 中有 cairo_push_group 函数的模拟?

请不要建议我切换到开罗。
图片更能说明问题:

我自己找到了答案。 一种方法是仍然使用 QPainterPath += 和 -= 运算符(与 QPainterPath::unitedQPainterPath::subtracted 方法相同),但不使用 any 贝塞尔曲线。我已经用 "polylines" 替换了所有圆弧、圆等(例如,每个圆都替换为 100 边形的多边形)。您只需更改边数等即可获得所需的任何质量。

另一个解决方案 - 使用临时 QImage - 似乎并不太慢并且工作正常。这也是在开罗完成的方式。只需创建一个与原始图像大小相同的 QImage,一个与原始图像具有相同设置的 QPainter,然后使用新的 QPainter 在临时图像上绘制,最后,使用在原始设备上绘制所有内容的 QPainter::drawImage 方法。