Здраствуйте!
Пробую сделать линию с маркерами, с помощью которых можно менять точки.
void Line::hoverEnterEvent(QGraphicsSceneHoverEvent *)
{
firstPointGrabber = new LineGrabber(this);
firstPointGrabber->setPos(QPointF(line().p1().x() - firstPointGrabber->getWidth() / 2, line().p1().y() - firstPointGrabber->getWidth() / 2));
firstPointGrabber->installSceneEventFilter(this);
secondPointGrabber = new LineGrabber(this);
secondPointGrabber->setPos(QPointF(line().p2().x() - secondPointGrabber->getWidth() / 2, line().p2().y() - secondPointGrabber->getWidth() / 2));
secondPointGrabber->installSceneEventFilter(this);
}
В hoverEnterEvent создаю два маркера,
void Line::hoverLeaveEvent(QGraphicsSceneHoverEvent *)
{
firstPointGrabber->setParentItem(0);
secondPointGrabber->setParentItem(0);
delete firstPointGrabber;
delete secondPointGrabber;
}
в hoverLeaveEvent удаляю.
bool Line::sceneEventFilter(QGraphicsItem *watched, QEvent *event)
{
LineGrabber *lineGrabber = dynamic_cast<LineGrabber *>(watched);
if(lineGrabber == 0)
return false;
QGraphicsSceneMouseEvent *mouseEvent = dynamic_cast<QGraphicsSceneMouseEvent *>(event);
if(mouseEvent == 0)
return false;
switch(mouseEvent->type())
{
case QEvent::GraphicsSceneMousePress:
{
lineGrabber->setMode(LineGrabber::m_press);
firstPointGrabber->setPoint(line().p1());
secondPointGrabber->setPoint(line().p2());
}
break;
case QEvent::GraphicsSceneMouseRelease:
{
lineGrabber->setMode(LineGrabber::m_release);
}
break;
case QEvent::GraphicsSceneMouseMove:
{
lineGrabber->setMode(LineGrabber::m_move);
}
break;
default:
return false;
}
if(lineGrabber->getMode() == LineGrabber::m_move)
{
if(lineGrabber == firstPointGrabber)
{
setLine(QLineF(mouseEvent->scenePos(), secondPointGrabber->getPoint()));
firstPointGrabber->setPos(mouseEvent->scenePos().x() - firstPointGrabber->getWidth() / 2, mouseEvent->scenePos().y() - firstPointGrabber->getWidth() / 2);
}
else
{
setLine(QLineF(firstPointGrabber->getPoint(),mouseEvent->scenePos()));
secondPointGrabber->setPos(mouseEvent->scenePos().x() - secondPointGrabber->getWidth() / 2, mouseEvent->scenePos().y() - secondPointGrabber->getWidth() / 2);
}
}
return true;
}
В sceneEventFilter отлавливаю событие нажатие, сохраняю начальные точки в маркерах и двигаю первую или вторую точку.
Пока линия находится на текущем месте работает все как надо, но если линию передвинуть, то получаются какие-то расстояния между точками и мышью, судя по всему проблемы с системой координат.