Обработка событий мыши QGraphicsItem'а

Рейтинг: 0Ответов: 1Опубликовано: 03.05.2015

Пишу такой таймлайн: введите сюда описание изображения

Каждый элемент это QGraphicsRectItem. Хочу даблкликом по элементу вызывать новый виджет (окно редактирования), узнал, что для этого необходимо переопределить функцию void QGrapicsItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent * event). Сделал #include <QGraphicsSceneMouseEvent>, создал экземпляр данного класа, что бы подать его на вход переопределенной функции.
Ну и сам вопрос, как мне переопределить эту функцию? Я если честно не понял, как это делается у элемента.
С собственным виджетом все понятно, он наследуется от QWidget, я в .h файле перегружаю функцию void QWidget::mouseDoubleClickEvent(QMouseEvent * event), в .cpp пишу реализацию и все работает, но где писать перегрузку функции для QGraphicsItem?

Ответы

▲ 1Принят

Как и в случае с QWidget Вы должны не просто создать экземпляр QGraphicsRectItem, но и написать собственный класс, наследующийся от него. В этом случае у Вас будет возможность переопределять виртуальные защищённые методы в том числе и QGraphicsItem, поскольку последний является базовым для всех item'ов сцены. Очевидно, что экземпляры объектов для использования нужно уже будет создавать от Вашего нового класса.

class MyGraphicsRectItem : public QGraphicsRectItem {
   public:
      //! Конструктор и прочее...

   protected:
      //! Событие двойного клика, реализуемое в cpp-файле.
      virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
};

Но также имеются ещё два способа получения и обработки событий на сцене.

Первый заключается в переопределении методов соответствующих событий непосредственно самого класса сцены. Конечно потребуется унаследовать QGraphicsScene в собственноручно созданном классе. В этом случае события для всех item'ов будут поступать в единый обработчик, а тот по различным критериям, которые Вы внесёте сами, будет формировать соответствующую логику исполнения.

Второй способ - установка фильтра событий.

my_scene->installSceneEventFilter(my_rect_item);

Ну а далее в собственном классе my_scene, унаследованном от QGraphicsScene переопределите виртуальный защищённый метод sceneEvent().

class MyScene : public QGraphicsScene {
   public:
      //! Конструктор и прочее...

   protected:
      //! Обработчик отфильтрованных событий.
      virtual bool sceneEvent(QEvent *event);
};

Данный способ в отличие от первого позволяет таргетированно подходить к вопросу обработки событий, т.к. для каждого конкретного объекта класса item'а можно установить собственный фильтр. Однако не рекомендуется этим злоупотреблять, поскольку данный подход может значительно снизить производительность.