Не вызывается mousePressEvent в QGraphicsRectItem

309
09 июля 2017, 13:59

Есть у меня класс 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);
        }
    }
Answer 1

Судя по всему, проблема в наличии группы. Вот минимальный пример, если заменить добавление объекта на добавление через группу (строка с маркером 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), в этом случае обработка событий будет производиться не группой, а самими дочерними элементами.

READ ALSO
C++ std::map. Crash

C++ std::map. Crash

При каких условия может произойти Segmentation fault при проверки контейнера на пустоту(empty)? Или поиск по койнтейнеру? Если учесть что в этот контейнер...

324
void* в структуре

void* в структуре

Здравствуйте помогите новичку, дело в том что нужно записывать в данную структуру методы, а после вызывать

314
Галерея лучше чем lightgallery? [требует правки]

Галерея лучше чем lightgallery? [требует правки]

Есть ли что еще более лучшее и совершеннее, чем JQuery плагин для просмотра изображений Light Gallery?

339
Мигающий header при скроле

Мигающий header при скроле

Решил сделать прилипающий header при скроле, при этом столкнулся с неприятным багомКогда происходит скрол header начинает мигать

350