QPainterPath объединение фигур (одиночный штрих)

Я пытаюсь создать объединение двух фигур с помощью QPainterPath, чтобы нарисовать комический шар:

const int kb = 4;
QRectF br = text_->boundingRect().adjusted(-kb, -kb, kb, kb);

// anchor on bottom side
qreal y = br.bottom();
qreal x = 0.5 * (br.left() - br.right()) + br.right();
const int kw = 6;

QPainterPath pTip;
pTip.moveTo(offset_);
pTip.lineTo(x - kw, y);
pTip.lineTo(x + kw, y);
pTip.lineTo(offset_);

QPainterPath pRect;
pRect.addRoundedRect(br, 2 * kb, 2 * kb);

shape_->setPath(pTip.united(pRect));

вот что я получаю:

фактический результат

в то время как я хотел бы получить единую форму, только с одним непрерывным контуром, например:

желаемый результат

Как я могу это решить?


person fferri    schedule 11.05.2018    source источник


Ответы (1)


Для удаления внутренних краев можно использовать QPainterPath::simplified():

Возвращает упрощенную версию этого пути. Это подразумевает объединение всех пересекающихся подпутей и возврат пути, не содержащего пересекающихся ребер. [...]

Обратите внимание, что это может испортить кривые Безье, если они есть на вашем пути, и что это сбрасывает правило заливки. Однако, поскольку вы не используете эти функции (по крайней мере, не в вашем примере), simplified() должно быть достаточно.

person hlt    schedule 11.05.2018
comment
Вы можете избежать недостаточной выборки кривых Безье, увеличив масштаб вашего пути рисования, уменьшив масштаб QPainter, нарисовав упрощенный путь, а затем увеличив масштабирование QPainter, например: pastebin.com/HK5UCy3k - person Kaaf; 08.11.2020