Не могу сообразить. Пытаюсь определить координаты клика по QGraphicsRectItem на

QGraphicsScene, в тестовом примере установил eventFilter на сцену. Координаты клика по сцене приходят, а по айтему - всегда 0,0. Что я делаю не так? :)
QGraphicsScene *MyGraphicsView::addScene()
{
if(m_Scene)
{
m_Scene->clear();
m_Scene->deleteLater();
}
m_Scene = new QGraphicsScene(this);
setScene(m_Scene);
m_Scene->installEventFilter(this);
return m_Scene;
}

bool MyGraphicsView::eventFilter(QObject *object, QEvent *event)
{
auto mouseEvent = static_cast<QGraphicsSceneMouseEvent *>(event);
if(!mouseEvent) return QGraphicsView::eventFilter(object, event);
if(event->type() == QEvent::GraphicsSceneMousePress)
{
qDebug() << "eventFilter:" << mouseEvent->scenePos() << mouseEvent->pos() << mouseEvent->lastPos();
}
return QGraphicsView::eventFilter(object, event);
}

8 ответов

10 просмотров

не вполне сообразил mouseEvent->pos() всегда по нулям?

Александр-⚛️ Автор вопроса
Александр ⚛️
да, всё кроме scenePos()

попробуй обработать (переопределить) конкретно void QGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) например ?

Александр-⚛️ Автор вопроса
Александр ⚛️
аналогично, всегда по нулям

что я думаю по поводу: ты перехватываешь событие в сцене, и реально евент не знает где он находится в итеме. И, возможно, не знает даже в каком он итеме. Потому что ты со сценой работаешь в данный момент. Тебе видимо остается все же самому определить QPointF QGraphicsItem::mapFromScene(const QPointF &point) const указав, какой именно итем ты рассматриваешь. Или же ловить евент для итемов. Ну это пол логике, ты со сценой работаешь, итемы как бы в других слоях находятся. Можно так: поставить фильтр один для всех итемов, там выловить кто сгенерил событие ну и взять координаты.

Александр-⚛️ Автор вопроса
Александр-⚛️ Автор вопроса
Angry Subst
что я думаю по поводу: ты перехватываешь событие ...

Да, вот такая история работает: if(event->type() == QEvent::GraphicsSceneMousePress) { auto itemclicked = m_Scene->itemAt(mouseEvent->scenePos(), transform()); if(!itemclicked) return QGraphicsView::eventFilter(object, event); qDebug() << "itemclicked:" << itemclicked->mapFromScene(mouseEvent->scenePos()); qDebug() << "eventFilter:" << mouseEvent->scenePos() << mouseEvent->pos(); }

Похожие вопросы

Обсуждают сегодня

вопрос: кто как решает вопрос с динамической подгрузкой скриптов для отдельных страниц с включенным turbo router?
Sergei Toroptsev
14
Почему Telegram пишет, что объект media не найден, хотя на самом деле я его передаю? Делаю на urllib, без зависимостей, так надо. Вызываю метод sendMediaGroup с таким JSON: ...
Alexey S
1
Сonst magicTgHTML = (text, entities) => { let processedText = text; let offsetShift = 0; entities.forEach(entity => { const { offset, length, type, url, ...
Андрей
1
Чет мне ссыкотно опять Rainlab.User в проект ставить. Кто знает, опять наотъебись все сделали или после обнов пользоваться можно?
Black Cat
10
ребят, привет есть ли возможность мигрировать Policies + Auth Methods из нескольких Vault в один? пытаюсь сократить Vault кластера, немного не удобно что для каждой тестовой ...
azadevlab
2
коллеги привет. уже второй день бьемся об заклад с одной ошибкой, может вы сталкивались с таки странным поведением? есть тестовый сервер, на который паблишим релизную версию W...
Magzhan
11
это группа токсиков или тех кто помогает?
Ибрагим
9
Всем привет. Кто подскажет, как сделать авто обновление стороннего модуля при запуске контейнера. Мб есть команда при запуске контенера или в докер файле нужно приписать настр...
Trum_t Malyuzhenets
1
В смысле более затратная? Общая стоимость владения лошадью меньше, чем автомобиля. В среднем.
Sergej R
10
Кстати, раз про скачивание файлов разговор зашел) Сделал бота для себя (транскрибирующего и суммаризирующего встречи) но не ожидал что за 2 месяца 10к пользователей набежит😅...
Andrey Obolenskiy
8
Карта сайта