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);
}
не вполне сообразил mouseEvent->pos() всегда по нулям?
да, всё кроме scenePos()
попробуй обработать (переопределить) конкретно void QGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) например ?
аналогично, всегда по нулям
что я думаю по поводу: ты перехватываешь событие в сцене, и реально евент не знает где он находится в итеме. И, возможно, не знает даже в каком он итеме. Потому что ты со сценой работаешь в данный момент. Тебе видимо остается все же самому определить QPointF QGraphicsItem::mapFromScene(const QPointF &point) const указав, какой именно итем ты рассматриваешь. Или же ловить евент для итемов. Ну это пол логике, ты со сценой работаешь, итемы как бы в других слоях находятся. Можно так: поставить фильтр один для всех итемов, там выловить кто сгенерил событие ну и взять координаты.
спасибо, надо попробовать
Да, вот такая история работает: 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(); }
Обсуждают сегодня