Как и в случае с 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'а можно установить собственный фильтр. Однако не рекомендуется этим злоупотреблять, поскольку данный подход может значительно снизить производительность.