2010-07-13 5 views
3

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

ответ

3

Редактировать: Используйте QGraphicsItem::installSceneEventFilter как предложено в ответе Фрэнк. Пример:

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

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

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

10

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

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

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

+3

Я предлагаю принять это как более релевантный ответ. –

-1

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

+0

Это не связано с вопросом. Он не спрашивал, нужен ли фильтр событий, только если его можно использовать. – Rafe

Смежные вопросы