0

私がこれを行うとき、私は問題を抱えてQPainterPathいます:

QPainterPath path(start);
path.quadTo(control, end);

QPainter painter;
painter.setBrush(Qt::black);
painter.drawPath(path);

曲線の下の領域も黒く描画します。使用してQPainterPath::closeSubpath()QPainterPath::moveTo(start)役に立ちません。役立つ唯一のことは、曲線を最初に戻すことです。これはばかげており、アンチエイリアシングをオンにすると見栄えが悪くなります。

しかし、これは視覚的な問題だけではありません。QGraphicsItem::shape() に同じコードを使用すると、実際にはアイテムの形状に曲線の下の領域が含まれてしまいますが、これは望ましくありません。

現在(上記コードあり)

ここに画像の説明を入力

希望( で作成QPainerPath::quadTo(control, start))

ここに画像の説明を入力

QPainter目的の曲線を2 回 (各方向から 1 回) 描画したため、曲線のエッジが悪いことに注意してください。

ここで何が間違っていますか?

4

1 に答える 1

2

あなたが間違っているのは、パスを効果的に塗りつぶして形状を作成する方法を使用していることです。

void QPainter::strokePath(const QPainterPath & path, const QPen & pen)代わりに、パス ストロークのみを描画するメソッドを使用する必要があります。

確かに、"draw path" は少しあいまいに聞こえます。QBrush芸術的なブラシとして機能することを期待すると、さらに悪化します。これらの名前を思いついたのはアーティストではなく、プログラマーだったと思います。

編集: 取得したいのがストローク/アウトラインの「形状」またはジオメトリ、つまり によって描画されるものQPainter::strokePath()である場合は、 でそれを生成し、結果のパスでQPainterPathStroker::createStroke(const QPainterPath & path)使用するQPainter::drawPath()と、 と同じ結果が得られますQPainter::strokePath()

編集 2: 私は最終的にあなたの意図 LOL を得ました。実際には、サブパスを使用することによって、単一のペインタ パス内に「個別/個別の曲線」を含めることができます。つまり、次のようになります。

    QPainter p(this);
    QPainterPath p1(QPointF(10,10)), p2(QPointF(50,10)), p3;
    p1.quadTo(QPointF(100,50), QPointF(100,200));
    p2.quadTo(QPointF(150,50), QPointF(150,200));
    p3.addPath(p1);
    p3.addPath(p2);
    p.strokePath(p3, QPen(Qt::black));

単純moveTo()に動作するようです:

    QPainter p(this);
    QPainterPath p1(QPointF(10,10));
    p1.quadTo(QPointF(100,50), QPointF(100,200));
    p1.moveTo(50, 10);
    p1.quadTo(QPointF(150,50), QPointF(150,200));
    p.strokePath(p1, QPen(Qt::black));

そしてtadaaa、1つのパスに複数の個別の曲線:

ここに画像の説明を入力

視覚的な出力が同じであるだけでなく、どちらのアプローチも同じ数のパス要素を持っているようです。しかし、コメントで述べたように、2 つの開いた曲線に対するこれらのソリューションは、実際には形状を生成しません。

于 2015-10-10T19:21:48.383 に答える