QPainterPath增长/扩展

时间:2011-04-20 12:37:27

标签: qt qgraphicsitem

有没有办法取一个QPainterPath并展开它,比如选择>在Photoshop中增长...(或展开...)命令?

我想从QPainterPath返回QGraphicsItem::shape,并将其作为QGraphicsPathItem的基础。但我希望将形状扩展一个给定的数量,比如说10个像素。然后围绕这个扩展的形状绘制一个薄的轮廓。

我可以种类通过将用于绘制QPen的{​​{1}}的宽度设置为20(我想要的宽度* 2,因为它在内部和一半外面)。这给了正确的外形,但有一条难看的粗线条;没有办法(我可以看到)获得这个形状并用细线勾勒出来。

QGraphicsPathItem课看起来很有希望,但我似乎无法做到我想要的。

2 个答案:

答案 0 :(得分:5)

QPainterPathStroker是一个正确的想法:

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

QPainterPath::operator+()统一了2条路径,simplified()合并了子路径。这也将处理“空心”路径。

答案 1 :(得分:5)

要按x像素增长QPainterPath,您可以使用带有2*x宽笔的QPainterPathStroker,然后将原始内容与描边路径结合使用:

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起,united() function(以及类似的集合运算)将路径转换为折线,以解决路径交叉点代码中的数值不稳定问题。虽然这对绘图来说很好(两种方法之间不应该有任何明显的区别),但是如果你打算保持QPainterPath,例如允许对它进行进一步的操作(你提到过Photoshop),然后这将破坏它中的所有贝塞尔曲线,这可能不是你想要的。