Самый простой способ вычислить расстояние между двумя точками - использовать QLineF
class:
class GraphicsView: public QGraphicsView
{
Q_OBJECT
public:
GraphicsView(QWidget* parent=nullptr): QGraphicsView(parent){}
virtual void mousePressEvent(QMouseEvent* event) override
{
// Take the position of the mouse in the scene coords
QPointF const pos = mapToScene(event->pos());
for(QGraphicsItem* item : scene()->items())
{
// Take the position of the items center
QPointF itemPos = item->mapToScene(item->boundingRect().center());
QLineF const distance(pos, itemPos);
qDebug() << pos << itemPos << distance.length();
}
qDebug() << "---";
}
};
Когда у вас есть расстояние между элементом и мышью, оно просто находит самое низкое значение:
virtual void mousePressEvent(QMouseEvent* event) override
{
QPointF const pos = mapToScene(event->pos());
QList<QGraphicsItem*> items = scene()->items();
auto closest = std::min_element(items.begin(), items.end(), [pos](const QGraphicsItem* left, const QGraphicsItem* right)
{
QPointF const leftPos = left->mapToScene(left->boundingRect().center());
QPointF const rightPos = right->mapToScene(right->boundingRect().center());
QLineF const distanceLeft(pos, leftPos);
QLineF const distanceRight(pos, rightPos);
return distanceLeft.length() < distanceRight.length();
});
QGraphicsRectItem* item = dynamic_cast<QGraphicsRectItem*>(*closest);
item->setBrush(Qt::red);
}