4

QPainterPathPhotoshop の Selection > Grow... (または Expand...) コマンドのように、それを取得して展開する方法はありますか?

QPainterPath返された fromを取得し、QGraphicsItem::shapeそれを a の基礎として使用したいと考えていQGraphicsPathItemます。しかし、私は形状を特定の量、たとえば 10 ピクセルだけ拡大したいと考えています。次に、この拡張された形状の周りに細い輪郭を描きます。

の幅を 20 に設定することで、これ行うことができます(内側の半分と外側の半分を描画QPenするため、希望の幅 * 2)。QGraphicsPathItemこれにより、正しい外側の形状が得られますが、醜い太い線が表示されます。この形状を取得して細い線で輪郭を描く方法は (私にはわかりますが) ありません。

クラスは有望に見えますQPainterPathStrokerが、私がやりたいことを成し遂げることができないようです。

4

2 に答える 2

6

QPainterPath をxピクセル単位で拡大するには、幅の広いペンでQPainterPathStrokerを使用し、元のパスをストローク パスと結合します。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 以降、united()関数(および同様の集合操作) はパスをポリラインに変換して、パス交差コードの数値的な不安定性を回避することに注意してください。これは描画には問題ありませんが (2 つの方法に目に見える違いはないはずです)、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 に答える