Есть у меня класс LifeView, унаследованный от QGraphicsView для отрисовки сцены LifeScene (унаследованная от QGraphicsScene).
На сцене изображаются элементы LifeCell (унаследованные от QGraphicsRectItem).
В LifeCell есть переопределенный метод обработки нажатия мыши
void LifeCell::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
// Если клетка живая была до нажатия, то перекрашиваем и делаем её мертвой
changeStatus((currentStatus == C_ALIVE) ? C_DIED : C_ALIVE);
qDebug() << "LifeCell: pressed";
QGraphicsRectItem::mousePressEvent(event);
}
Все элементы LifeCell у меня находятся в QGraphicsItemGroup.
Но в выводе приложения только такое:
LifeView: pressed
Хотя, по идее должно быть также:
LifeCell: pressed
Окей, пробовал сделать так, как написано в интернете:
void LifeView::mousePressEvent(QMouseEvent *event)
{
qDebug() << "LifeView: pressed";
QGraphicsView::mousePressEvent(event);
event->accept();
}
В LifeView добавил такую строчку:
this->setMouseTracking(true);
Ничего не поменялось. Что я не так делаю?
upd Добавление в группу происходит у меня так.
m_itemGroup = new QGraphicsItemGroup();
this->addItem(m_itemGroup);
LifeCell *pCell = nullptr;
for (size_t i = 0; i < rowCount; i++)
{
for (size_t j = 0; j < colCount; j++)
{
QRectF rect;
// Вычисление координат клетки
qreal x = j * cellSize;
qreal y = i * cellSize;
rect.setX(x); rect.setY(y);
rect.setWidth(cellSize); rect.setHeight(cellSize);
pCell = new LifeCell(rect);
m_itemGroup->addToGroup(pCell);
}
}
Судя по всему, проблема в наличии группы. Вот минимальный пример, если заменить добавление объекта на добавление через группу (строка с маркером 1), Item перестает принимать событие.
#include <QApplication>
#include <QDebug>
#include <QGraphicsRectItem>
#include <QGraphicsView>
#include <QMouseEvent>
class View : public QGraphicsView
{
protected:
void mousePressEvent(QMouseEvent *event)
{
qDebug()<<"VIEW CLICKED";
QGraphicsView::mousePressEvent(event);
}
};
class Item : public QGraphicsRectItem
{
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event)
{
qDebug()<<"ITEM CLICKED";
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Item *item = new Item;
item->setRect(20, 20, 60, 60);
QGraphicsScene scene(0, 0, 100, 100);
// scene.createItemGroup(QList<QGraphicsItem *>() << item); //[1]
scene.addItem(item); //[2]
View view;
view.setScene(&scene);
view.show();
return a.exec();
}
Для решения проблемы можно не убирать группу, достаточно вызвать для группы setHandlesChildEvents(false), в этом случае обработка событий будет производиться не группой, а самими дочерними элементами.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости