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

时间:2016-08-10 20:08:59

标签: c++ qt integration cairo

我正在使用QPainter编写应用程序,我需要在QPainter类中使用cairo_push_group的模拟来绘制一个带有一堆孔的矩形,它可能会相交。

问题在于,当我用" clear"构图模式,一切都在我绘制的洞下清除;我希望在开始绘制复杂形状之前,在洞下面的图像留下来。换句话说 - 当我只想让洞下面的所有东西透过时,洞下面的一切都被清除了。

一个解决方案似乎是使用带有奇数填充选项的QPainterPath(默认选项),但这不适合我,因为在我的应用程序中,孔可能会相交,这样两个洞赢了&#39 ; t结合(两个孔的交点不是一个洞)。

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

另一个解决方案是将我正在绘制的QImage保存到临时QImage,清除它,绘制我需要的所有内容,然后使用"目标而不是#34;模式再次绘制它,但这似乎是一个非常缓慢和耗费内存的解决方案。

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

请不要建议我切换到开罗 图片更好地解释了问题:Pictures

1 个答案:

答案 0 :(得分:1)

我自己找到了一个人。 一种方法是仍然使用QPainterPath + =和 - =运算符(与QPainterPath::unitedQPainterPath::subtracted方法相同),但不使用任何 bezier曲线。我用“折线”替换了所有的圆弧,圆圈等(例如,每个圆都用100边的多边形代替)。只需更改边数等,即可达到所需的任何质量。

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