使用Qt Graphics跟踪轮廓

Tracing an outline using Qt Graphics

本文关键字:轮廓 跟踪 Graphics Qt 使用      更新时间:2023-10-16

我正在创建一个漫画书编辑器。我希望能够为语音气球使用一些相当复杂的可定制形状。

我可以画尾巴,然后画一个气球,但这意味着我在形状内部有轮廓,我只想要它的边缘。

我以为QPainterPath::simplified()可以解决这个问题,但它似乎没有任何作用。

目前,我最好的想法是画一个有粗轮廓的形状,然后在没有轮廓的情况下再次画,但我认为这对"零宽度"轮廓不起作用。

我可以在这里想到两种可能的解决方案:

  • 将"尾部"和主"气球"绘制为单个形状在这种情况下,您只需绘制一个具有单个轮廓和单个填充的单个形状
  • 分别绘制,但要绘制两次。先用黑色画一个"扩展"版的形状,然后在其顶部用白色画"正常"版的图形。你根本不会画任何"线"——填充的"扩展"版本也可以达到同样的目的

第一种方法允许使用其他线条样式(虚线或摆动线),但后者允许"轮廓"稍微偏移,这样它在某些边缘看起来更厚,在其他边缘看起来更薄。

事实证明QPainterPath::simplified()确实有效。这取决于我画的是顺时针还是逆时针(我相信顺时针画的时候可以),我认为这取决于Qt的绕组填充的工作方式。

// create a path representing the bubble and its "tail"
QPainterPath tail = tail.shape();
tail.addPath(bubble.shape());
tail.setFillRule(Qt::WindingFill);
painter->drawPath(tail.simplified);