我正在使用QPainter编写应用程序,我需要在QPainter类中使用cairo_push_group的模拟来绘制一个带有一堆孔的矩形,它可能会相交。
问题在于,当我用" clear"构图模式,一切都在我绘制的洞下清除;我希望在开始绘制复杂形状之前,在洞下面的图像留下来。换句话说 - 当我只想让洞下面的所有东西透过时,洞下面的一切都被清除了。
一个解决方案似乎是使用带有奇数填充选项的QPainterPath
(默认选项),但这不适合我,因为在我的应用程序中,孔可能会相交,这样两个洞赢了&#39 ; t结合(两个孔的交点不是一个洞)。
另一种解决方案是仅使用QPainterPath::subtracted
方法,但由于某种原因,它会降低多边形的质量(例如,圆形变为具有可数边数的形状)。
另一个解决方案是将我正在绘制的QImage
保存到临时QImage
,清除它,绘制我需要的所有内容,然后使用"目标而不是#34;模式再次绘制它,但这似乎是一个非常缓慢和耗费内存的解决方案。
这个问题还有其他解决办法吗?也许在Qt中有cairo_push_group函数的模拟?
答案 0 :(得分:1)
我自己找到了一个人。
一种方法是仍然使用QPainterPath
+ =和 - =运算符(与QPainterPath::united
和QPainterPath::subtracted
方法相同),但不使用任何强> bezier曲线。我用“折线”替换了所有的圆弧,圆圈等(例如,每个圆都用100边的多边形代替)。只需更改边数等,即可达到所需的任何质量。
另一个解决方案 - 使用临时QImage
- 似乎不是太慢而且工作正常。这也是在cairo中完成的方式。只需创建一个与原始版本相同的QImage
QPainter
,其设置与原始版本相同,并使用新的QPainter
绘制临时图像,最后使用用于在原始设备上绘制所有内容的QPainter::drawImage
方法。