2010-07-13 95 views

回答

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. 

那突然出现在我的脑海里的第一件事情是这样的:

创建一个新的类,从QGraphicsItemQObject衍生的,因为这些是无关的(只要一浏览文档告诉我),你应该有你想要的。

....但后来我看了看文档更加紧密,发现QGraphicsObject,这可能是你想要什么,它甚至已经拥有成员eventFilter

10

的QGraphicsItem的不QObject对象,但他们仍收到事件,由他们的QGraphicsScene管理。它也支持事件过滤。 QGraphicsItem :: installSceneEventFilter(QGraphicsItem * filterItem)安装另一个项目来接收事件。重写筛选器项目中的sceneEventFilter()以处理它们。它类似于QObject :: eventFilter。重要提示:您安装过滤器的项目必须已经添加到场景中才能使用。

如果过滤器项目不应该做别的,但过滤器,我认为最简单的方法是从QGraphicsItem派生,实现paint()不做任何事,boundingRect()返回一个空的矩形。当然,重新实现sceneEventFilter。

另请注意,某些事件类在QGraphicsView上下文中发生变化,例如, QMouseEvent成为QGraphicsSceneMouseEvent,所以请确保筛选正确的东西。

+3

我建议接受这个作为更相关的答案。 – 2014-02-01 05:26:42

-1

如果您继承了QGraphicsView,您还可以选择仅实现许多...Event()函数中的任何一个。在这种情况下,你不需要事件过滤器。

+0

这与问题无关。他没有问过什么时候需要事件过滤器,只有在可以使用事件过滤器的时候。 – Rafe 2017-07-18 15:48:33