QPainterPath закрывает подпуть кривой в конечной точке

У меня проблема с 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 нарисовать его дважды - по одному с каждого направления.

Что я здесь не так делаю?

1 ответ

Решение

То, что вы делаете неправильно, вы используете метод, который эффективно заполняет путь, создавая форму.

Вы должны использовать void QPainter::strokePath(const QPainterPath & path, const QPen & pen) вместо этого метод, который будет рисовать только обводку.

Конечно, "путь прорисовки" звучит немного двусмысленно. Это становится еще хуже, ожидая 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));

И тадааа, несколько отдельных кривых в одном пути:

Похоже, что не только визуальный вывод одинаков, оба подхода также имеют одинаковые элементы числа пути. Тем не менее, как упоминалось в комментариях, ни одно из этих решений для двух открытых кривых фактически не дает форму.

Другие вопросы по тегам