QPainterPath растут / расширяются - PullRequest
4 голосов
/ 20 апреля 2011

Есть ли способ взять QPainterPath и развернуть его, как команда «Выделение»> «Увеличить ... (или Развернуть ...)» в Photoshop?

Я хочу взять QPainterPathвернулся из QGraphicsItem::shape и использовать это в качестве основы для QGraphicsPathItem.Но я хочу расширить фигуру на определенную величину, скажем, на 10 пикселей вокруг.А затем нарисуйте тонкий контур вокруг этой расширенной формы.

Я могу вид сделать это, установив ширину QPen, используемую для рисования QGraphicsPathItem до 20 (мой желаемыйширина * 2, потому что он рисует половину внутри и наполовину снаружи).Это дает правильную внешнюю форму, но с уродливой толстой линией;нет никакого способа (который я вижу) получить эту форму и обвести ее тонкой линией.

Класс QPainterPathStroker выглядит многообещающим, но я не могу получитьделать то, что я хочу.

Ответы [ 2 ]

5 голосов
/ 20 апреля 2011

Чтобы увеличить 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() (и аналогичные операции над множествами) превращает пути в полилинии, чтобы обойти числовую нестабильность в коде пересечения путей. Хотя это хорошо для рисования (не должно быть никакой видимой разницы между этими двумя методами), если вы намереваетесь сохранить QPainterPath, например, чтобы разрешить дальнейшие операции над ним (вы упомянули Photoshop), тогда это уничтожит все кривые Безье в нем, что, вероятно, не то, что вы хотели.

5 голосов
/ 20 апреля 2011

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() объединяет подпути. Это также будет обрабатывать "пустотелые" пути.

...