4

给定一个QPainterPath如何仅在路径的内部或外部边缘(或非封闭路径的左侧或右侧)上描边路径?

QPainter::strokePath()使笔沿路径居中并使相同数量的墨水落在两侧。有关所需效果的视觉示例,请参见我制作的此图(针对 SVG 提案,而不是功能):

SVG 提出的笔画位置示例,来自 phrogz.net/SVG/stroke-location.svg

我不介意这是通过一些技巧来完成的,例如将路径本身设置为剪切区域(用于内部)或反剪切区域(用于外部)。

这里的目标是用低不透明度填充填充一个圆角矩形,然后用低不透明度描边在圆角矩形之外进行描边,以模拟 2 步“模糊”衰减。如果描边与填充重叠,则不透明度加倍,破坏效果。由于形状复杂,路径的简单缩放不会很好地工作,即使它可能适用于上面绘制的圆形和矩形。

4

2 回答 2

6

Your best bet is probably QPainterPathStroker. Use it to create a new path that's the outline of your path. Then use QPainterPath operations like intersection or subtraction between the two:

outsidePath = strokedPath.subtracted(originalPath);
insidePath = strokedPath.intersected(originalPath);
于 2013-03-01T22:44:36.723 回答
1

更好的方法是将混合模式设置为CompositionMode_Source

QPainter * painter;
painter->setCompositionMode(QPainter::CompositionMode_Source);
painter->setPen(QPen{color, stroke, ...});
painter->setBrush(QBrush{...});

QPainterPath path;
path.moveTo(...);
path.lineTo(...);
...

// No alpha composition issues
painter->fillPath();
于 2019-07-26T09:36:50.403 回答