Qt C ++ Позволяет множественному QGraphicsItem обрабатывать одно событие мыши - PullRequest
3 голосов
/ 18 декабря 2011

Я создал объект Chartblock, который реализует QGraphicsItem. Моя цель состоит в том, чтобы создать сетку из этих объектов, и когда кнопка мыши нажата (и удерживается) и находится над каждым блоком, выполняйте что-то для каждого блока, когда курсор входит в него.

Поскольку QGraphicsItem захватывает события мыши при щелчке внутри него, другие объекты не будут запускаться для mouseMoveEvent. Затем я создал объект на основе QGraphicsItemGroup для обработки всех событий мыши, но затем мне понадобится какой-нибудь способ передать mousePressEvent / mouseReleaseEvent, а также mouseMoveEvent каждому дочернему элементу, на котором находится курсор.

Думаю ли я, как это сделать? Кажется, что такое простое действие не должно быть таким трудным для создания, но с QGraphicsItems, держащим события мыши для себя, я не уверен, как обойти это. Я читал подобные ситуации, но, похоже, ничего не дает однозначного ответа.

Редактировать: Я полагаю, что способ сделать это будет отслеживать координаты / размеры каждого QGraphicsItem, который я создаю в массиве, затем получить позицию курсора в группе mouseMoveEvent и посмотреть, есть ли попадание ..

1 Ответ

1 голос
/ 19 декабря 2011

Мне удалось собрать несколько похожих ответов, чтобы создать решение;Я отбросил идею размещения всех моих QGraphicItem в группе и разместил их прямо на сцене.Когда сцена захватывает все события мыши, у меня есть проверка mouseMoveEvent, чтобы увидеть, находится ли текущая позиция поверх QGraphicsItem - если это так, выполните что-то.для моих собственных классов, которые реализуют QGraphicsItem, так как itemAt возвращает только QGraphicsItem, но я уверен, что некоторые приведения должны заставить его работать.

void ChartScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    QPointF mousePosition = event->scenePos();
    QGraphicsItem* pItem = this->itemAt(mousePosition.x(), mousePosition.y());
}
...