выделение во многих полилиниях с QGraphicsView не работает нормально - PullRequest
2 голосов
/ 31 августа 2010

В Qt нет «QGraphicsPolylineItem», поэтому я должен реализовать его из QGraphicsItem. Я переопределяю функции 'paint' и 'boundingRect'. В функции 'paint ()' я просто рисую все линии в полилинии. Это нормально без какого-либо взаимодействия с пользователем. Для выбора и подвижной функции я переопределяю функцию 'QPainterPath * shape ()' следующим образом:

QPainterPath ContourLineShape::shape() const
  {
    QPainterPath path;
    QPointF p0=this->poly.at(0)->at(0);
    path.moveTo(p0.x(),p0.y());
    foreach(QPointF p,poly)
        path.lineTo(p.x(),p.y());
        return path;
  }

но результат неверный. когда я нажимаю на полилинию, она всегда выбирает другую. Затем я пытаюсь осуществить выбор самостоятельно, например:

void GraphicsView::mousePressEvent ( QMouseEvent * event )
{
    int x=event->pos().x();
    int y=event->pos().y();

    QList<QGraphicsItem *>items=this->items(x-5,y-5,10,10,Qt::IntersectsItemShape);
    for(int i=items.size()-1;i>=0;i--)
    {
        QGraphicsItem *item=items.at(i);

        if(item->type()==QGraphicsItem::UserType+4)//UserType+4 is my polyline type.
        {
            item->setSelected(true);
            return; //one shape has been selected.
        }
    }
}

Это решение выглядит правильным, но оно не точное. Если такая ломаная линия:

      ----------------------
     |
     |      o<-click here   |
     |                      |
     |  /\   /\             |
     | /  \ /  \ /-----------
      /    V    V

Точка щелчка находится далеко от связанных линий, но форма все еще может быть выбрана (это не то, что я хотел). Даже если я изменил режим выбора на Qt :: ContainsItemBoundingRect или Qt :: ContainsItemShape .., результат все равно будет неправильным. Есть ли простой способ решить эту проблему? Или я должен вычислить расстояния от «точки щелчка» до всех сегментов, чтобы решить, выбран ли он?

Спасибо!

1 Ответ

0 голосов
/ 01 сентября 2010

Помогает ли звонок setFlags(QGraphicsItem::ItemClipsToShape)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...