Point-in-poly для QPainterPath с отверстиями - PullRequest
1 голос
/ 21 февраля 2010

Я пытаюсь использовать QGraphicsPathItem для представления многоугольника с дырой в нем (думаю, пончик). Я могу заставить его рисовать правильно, и центр прозрачен. Однако с включенным выбором элемента или движением я могу взаимодействовать с моим объектом при щелчке в отверстии. Я предпочел бы относиться к отверстию как к части многоугольника.

Я провел некоторое тестирование, и похоже, что QPainterPath :: contains () вернет true, когда я проверю точку внутри отверстия. Нужно ли создавать подкласс QGraphicsPathItem для реализации более конкретной функции contains (), или я что-то упускаю?

Ответы [ 2 ]

1 голос
/ 21 февраля 2010

Если вы измените правило заполнения со значения по умолчанию Qt :: OddEvenFill на Qt :: WindingFill, можете ли вы все еще увидеть дыру? Я думаю, вы не сможете увидеть дыру. Таким образом, дыра на самом деле не является «физической» дырой на вашем пути. Если вы собираетесь представлять многоугольник с отверстием, вам может потребоваться создать подкласс QGraphicsPathItem, явно определить самый внешний путь и отверстия и сохранить связь между путями в другой роли.

0 голосов
/ 28 сентября 2013

Вам нужно будет создать подкласс QGraphicsPathItem и переопределить метод shape.Вот что я сделал, чтобы решить аналогичную проблему с незаполненным и заполненным прямоугольником.Этот частный случай подкласс от QGraphicsRectItem.Это также имеет некоторую регулировку ширины пути, чтобы пользователю было легче щелкать, по существу, буферную зону вокруг пути.

В случае заполненного прямоугольника возвращаемая фигура представляет собой просто прямоугольник,но для незаполненного прямоугольника это обведенный путь с пустым внутренним пространством.Тогда объект перемещается только тогда, когда пользователь перетаскивает край, но не середину.Выяснить, что QPainterPathStroker не было интуитивно понятно из документации, но на самом деле его было довольно просто использовать.

QPainterPath MyRectItem::shape (void) const
    {
    if (this->brush().style() != Qt::NoBrush)
        {
        return QGraphicsRectItem::shape();
        }

    // The rectangle is unfilled. Create a path outlining the rectangle.

    QPainterPath path;

    QRectF rect = this->rect();

    path.moveTo (rect.topLeft());
    path.lineTo (rect.topRight());
    path.lineTo (rect.bottomRight());
    path.lineTo (rect.bottomLeft());
    path.lineTo (rect.topLeft());

    QPainterPathStroker stroker;

    if (this->pen().style() != Qt::NoPen)
        {
        // For easier selection, increase the pen width to provide a buffer zone
        // around the line where the user can click and still select.

        stroker.setWidth     (this->pen().width() + 20);
        stroker.setCapStyle  (this->pen().capStyle());
        stroker.setJoinStyle (this->pen().joinStyle());
        }

    return stroker.createStroke (path);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...