只在内/外抚摸一条路径?

时间:2013-03-01 20:56:50

标签: qt qpainter

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

QPainter::strokePath()使笔沿着路径居中,并导致相同数量的墨水落在两侧。有关所需效果的可视示例,请参阅我所做的图(对于SVG提议,而非功能):

SVG proposed stroke-location example, from phrogz.net/SVG/stroke-location.svg

我不介意这是通过某种黑客来完成的,例如将路径本身设置为剪辑区域(用于内部)或反剪辑区域(用于外部)。

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

2 个答案:

答案 0 :(得分:6)

你最好的选择可能是QPainterPathStroker。用它来创建一条路径轮廓的新路径。然后使用QPainterPath操作,如两者之间的交叉或减法:

outsidePath = strokedPath.subtracted(originalPath);
insidePath = strokedPath.intersected(originalPath);

答案 1 :(得分:0)

一种更好的方法是将混合模式设置为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();