4

QPainterPathパスの内側または外側の端(または閉じていないパスの場合は左側または右側)でのみパスをストロークするにはどうすればよいですか?

QPainter::strokePath()パスに沿ってペンを中央に配置し、同じ量のインクを両側に落とします。望ましい効果の視覚的な例については、私が作成したこのグラフィックを参照してください(SVGの提案であり、機能ではありません)。

SVGは、phrogz.net / SVG/stroke-location.svgからストローク位置の例を提案しました

これが、パス自体をクリッピング領域(内側の場合)またはアンチクリッピング領域(外側の場合)として設定するなどのハックによって行われるかどうかは気になりません。

ここでの目標は、丸みを帯びた長方形を不透明度の低い塗りつぶしで塗りつぶしてから、そのすぐ外側を不透明度の低いストロークでストロークして、2段階の「ぼかし」フォールオフをシミュレートすることです。ストロークが塗りつぶしと重なると、不透明度が2倍になり、効果が損なわれます。形状が複雑なため、上に描いた円や長方形では機能する場合でも、パスの単純なスケーリングは適切に機能しません。

4

2 に答える 2

6

あなたの最善の策はおそらくQPainterPathStrokerです。これを使用して、パスのアウトラインである新しいパスを作成します。次に、2つの間の交差や減算などのQPainterPath演算を使用します。

outsidePath = strokedPath.subtracted(originalPath);
insidePath = strokedPath.intersected(originalPath);
于 2013-03-01T22:44:36.723 に答える
1

より良いアプローチは、ブレンディングモードをCompositionMode_Source次のように設定することです。

QPainter * painter;
painter->setCompositionMode(QPainter::CompositionMode_Source);
painter->setPen(QPen{color, stroke, ...});
painter->setBrush(QBrush{...});

QPainterPath path;
path.moveTo(...);
path.lineTo(...);
...

// No alpha composition issues
painter->fillPath();
于 2019-07-26T09:36:50.403 に答える