В 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 .., результат все равно будет неправильным.
Есть ли простой способ решить эту проблему? Или я должен вычислить расстояния от «точки щелчка» до всех сегментов, чтобы решить, выбран ли он?
Спасибо!