有没有办法取一个QPainterPath
并展开它,比如选择>在Photoshop中增长...(或展开...)命令?
我想从QPainterPath
返回QGraphicsItem::shape
,并将其作为QGraphicsPathItem
的基础。但我希望将形状扩展一个给定的数量,比如说10个像素。然后围绕这个扩展的形状绘制一个薄的轮廓。
我可以种类通过将用于绘制QPen
的{{1}}的宽度设置为20(我想要的宽度* 2,因为它在内部和一半外面)。这给了正确的外形,但有一条难看的粗线条;没有办法(我可以看到)获得这个形状并用细线勾勒出来。
QGraphicsPathItem
课看起来很有希望,但我似乎无法做到我想要的。
答案 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),然后这将破坏它中的所有贝塞尔曲线,这可能不是你想要的。