4

有什么方法可以QPainterPath扩展它,比如 Photoshop 中的选择 > 增长...(或扩展...)命令?

我想QPainterPath取回 fromQGraphicsItem::shape并将其用作QGraphicsPathItem. 但我想将形状扩大给定的数量,比如周围 10 个像素。然后在这个展开的形状周围画一个细的轮廓。

我可以通过将用于绘制的宽度设置为 20做到这一点(我想要的宽度 * 2,因为它在内部绘制一半,在外部绘制一半)。这给出了正确的外部形状,但线条丑陋;没有办法(我可以看到)得到这个形状并用细线勾勒它。QPenQGraphicsPathItem

QPainterPathStroker门课看起来很有希望,但我似乎无法按照我的意愿去做。

4

2 回答 2

6

x要按像素增长 QPainterPath ,您可以使用带有宽笔的QPainterPathStroker2*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 开始,该united()函数(和类似的集合操作)将路径转换为折线,以解决路径交叉代码中的数值不稳定性问题。虽然这对于绘图很好(这两种方法之间不应该有任何明显的差异),但如果您打算保留 QPainterPath,例如允许对其进行进一步操作(您提到 Photoshop),那么这将破坏所有贝塞尔曲线在里面,这可能不是你想要的。

于 2011-04-20T14:55:58.863 回答
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()合并子路径。这也将处理“空心”路径。

于 2011-04-20T14:48:55.060 回答