Фильтр событий на QGraphicsItem - PullRequest
4 голосов
/ 13 июля 2010

Возможно ли иметь фильтр событий на QGraphicsItem?Eventfilter имеет параметр, который дает вам QObject, но, поскольку QGraphicsItem не является производным от QObject, то как он будет работать?

Ответы [ 4 ]

11 голосов
/ 13 июля 2010

QGraphicsItem не являются объектами QObject, но они по-прежнему получают события, управляемые их QGraphicsScene. И это также поддерживает фильтрацию событий. QGraphicsItem :: installSceneEventFilter (QGraphicsItem * filterItem) устанавливает другой элемент для получения событий. Переопределите sceneEventFilter () в элементе фильтра, чтобы обработать их. Он работает аналогично QObject :: eventFilter. Важное замечание: Элемент, на который вы устанавливаете фильтр, должен быть уже добавлен в сцену, чтобы он работал.

Если элемент фильтра не должен делать ничего другого, кроме фильтра, я думаю, что самый простой способ - это извлечь из QGraphicsItem, реализовать paint () ничего не делать и boundingRect () вернуть пустой прямоугольник. И переопределение сцены EventFilter конечно.

Также обратите внимание, что некоторые классы событий изменяются в контексте QGraphicsView, например, QMouseEvent становится QGraphicsSceneMouseEvent, поэтому убедитесь, что вы выбрали правильный фильтр.

4 голосов
/ 13 июля 2010

Редактировать: Использовать QGraphicsItem :: installSceneEventFilter , как предложено в ответе @ Frank.Пример:

QGraphicsScene scene;
QGraphicsEllipseItem *ellipse = scene.addEllipse(QRectF(-10, -10, 20, 20));
QGraphicsLineItem *line = scene.addLine(QLineF(-10, -10, 20, 20));
line->installSceneEventFilter(ellipse);
// line's events are filtered by ellipse's sceneEventFilter() function.
ellipse->installSceneEventFilter(line);
// ellipse's events are filtered by line's sceneEventFilter() function.

Первое, что пришло мне в голову, было:

Создать новый класс, производный от обоих QGraphicsItem и QObject, поскольку они не связаны (насколько мне кажется, если взглянуть на документы), у вас должно быть то, что вы хотели.

.... Но потом я более внимательно посмотрел на документы и обнаружил QGraphicsObject,что, вероятно, именно то, что вы хотите, он даже уже имеет член eventFilter

0 голосов
/ 23 июля 2014

В случае, если вы подклассифицируете QGraphicsView, у вас также есть возможность просто переопределить любую из многих ...Event() функций. В таких случаях вам не нужен фильтр событий.

0 голосов
/ 13 июля 2010

Нет. Вы не можете установить фильтр событий в QGraphicsItem напрямую, так как это не QObject. Если вы производите свой собственный QGraphicsItem, наследуйте от QGraphicsObject, чтобы он получал функции QObject.

Одной из возможностей является использование http://doc.trolltech.com/latest/qgraphicsitem.html#installSceneEventFilter, но оно более ограничено, поскольку требует, чтобы обработчик тоже был QGraphicsItem.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...