【问题标题】:cairo_push_group analog in Qt: "clear" composition mode clears everything underneath itQt 中的 cairo_push_group 模拟:“清除”组合模式会清除它下面的所有内容
【发布时间】:2016-12-17 09:09:45
【问题描述】:

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

问题是,当我使用“清除”组合模式绘制孔时,我绘制的孔下方的所有内容都会被清除;我想要在我开始绘制复杂形状之前位于孔下方的图像保留下来。换句话说 - 洞下的所有东西都被清除了,而我只想让洞下的所有东西都能被看到。

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

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

另一个解决方案是将我正在绘制的QImage 保存到一个临时的QImage,清除它,绘制我需要的所有内容,然后使用“目标结束”模式再次绘制它,但这似乎是一个非常缓慢且消耗内存的解决方案。

这个问题还有其他解决方案吗?也许 Qt 中有 cairo_push_group 函数的类似物?

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

【问题讨论】:

    标签: c++ qt integration cairo


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 1970-01-01
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多