Я пытаюсь понять, какой элемент ближе к координате мыши coord.x или coord.y. Я думаю, что-то вроде этого, но не получается после многих попыток. У меня работают координаты мыши, это просто часть QList, где я не могу ее получить.
void findcloser()
{
QList<QGraphicsItem *> allitems = items();
QList<QGraphicsItem *> alltypedos;
foreach(auto item, allitems) {
if (item->type() == chord::Type) {
alltypedos.append(item);
}
}
getcloser(alltypedos.begin(), alltypedos.end(), mouse.x);
getcloser(alltypedos.begin(), alltypedos.end(), mouse.y);
}
Самый простой способ рассчитать расстояние между двумя точками — использовать класс QLineF
:
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);
}