Как найти ближе QGraphicsItem (в QList) к координатам мыши x или мыши y? - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь определить, какой элемент ближе к мышке координату или координату. Полагаю, это что-то в этом роде, но не получайте его после долгих попыток. У меня работают координаты мыши, это только часть 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);
}

1 Ответ

0 голосов
/ 27 мая 2019

Самый простой способ вычислить расстояние между двумя точками - использовать 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...