Qt QPainterPath增长/扩展

Qt QPainterPath增长/扩展,qt,qgraphicsitem,Qt,Qgraphicsitem,是否有任何方法可以获取QPainterPath并将其展开,如选择>增长。。。Photoshop中的(或展开…)命令 我想使用从QGraphicsItem::shape返回的QPainterPath,并将其用作QGraphicsPathItem的基础。但是我想把形状扩展一个给定的量,比如说10个像素。然后围绕这个展开的形状画一个薄薄的轮廓 我可以通过将用于绘制QGraphicsPathItem的QPen的宽度设置为20(我所需的宽度*2,因为它绘制了一半内部和一半外部)。这给了正确的外部形状,但与

是否有任何方法可以获取
QPainterPath
并将其展开,如选择>增长。。。Photoshop中的(或展开…)命令

我想使用从
QGraphicsItem::shape
返回的
QPainterPath
,并将其用作
QGraphicsPathItem
的基础。但是我想把形状扩展一个给定的量,比如说10个像素。然后围绕这个展开的形状画一个薄薄的轮廓

我可以通过将用于绘制
QGraphicsPathItem
QPen
的宽度设置为20(我所需的宽度*2,因为它绘制了一半内部和一半外部)。这给了正确的外部形状,但与丑陋的粗线;没有办法(我可以看到)得到这个形状并用细线勾勒出来


QPainterPathStroker
类看起来很有希望,但我似乎无法让它达到我想要的效果。

QPainterPathStroker是一个正确的想法:

QPainterPathStroker stroker;
stroker.setWidth(20);
stroker.setJoinStyle(Qt::MiterJoin); // and other adjustments you need
QPainterPath newpath = (stroker.createStroke(oldPath) + oldPath).simplified();

合并2条路径并合并子路径。这也将处理“空心”路径。

要将QPainterPath增加
x
像素,可以使用带有
2*x
宽画笔的画笔,然后将原始画笔与笔划路径合并:

QPainterPath grow( const QPainterPath & pp, int amount ) {
    QPainterPathStroker stroker;
    stroker.setWidth( 2 * amount );
    const QPainterPath stroked = stroker.createStroke( pp );
    return stroked.united( pp );
}
但是,请注意,自Qt 4.7以来,(和类似的集合操作)将路径转换为多段线,以解决路径交点代码中的数值不稳定问题。虽然这对绘图很好(两种方法之间不应有任何明显的区别),但如果您打算保留QPainterPath,例如允许对其进行进一步操作(您提到的Photoshop),则这将破坏其中的所有bezier曲线,这可能不是您想要的