QGraphicsItem上的事件过滤器

时间:2010-07-13 16:59:27

标签: c++ qt events

是否可以在QGraphicsItem上设置事件过滤器? Eventfilter有一个param,为您提供QObject,但由于QGraphicsItem不是来自QObject,那么它将如何运作?

4 个答案:

答案 0 :(得分:11)

QGraphicsItem不是QObject,但它们仍然接收由QGraphicsScene管理的事件。它还支持事件过滤。 QGraphicsItem :: installSceneEventFilter(QGraphicsItem * filterItem)安装另一个项目来接收事件。覆盖过滤器项中的sceneEventFilter()以处理它们。它类似于QObject :: eventFilter。重要提示:您必须已将安装过滤器的项目添加到场景中以使其正常工作。

如果过滤器项除了过滤器之外什么都不做,我认为最简单的方法是从QGraphicsItem派生,实现paint()不做任何事情,boundingRect()返回一个空的rect。并重新实现sceneEventFilter当然。

另请注意,QGraphicsView上下文中的某些事件类会发生变化,例如: QMouseEvent成为QGraphicsSceneMouseEvent,所以一定要过滤正确的东西。

答案 1 :(得分:4)

修改:按照@ Frank的回答中的建议使用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

答案 2 :(得分:0)

没有。您不能直接将事件过滤器安装到QGraphicsItem,因为它不是QObject。如果要派生自己的QGraphicsItem,则从QGraphicsObject继承,以便获得QObject函数。

一种可能性是使用http://doc.trolltech.com/latest/qgraphicsitem.html#installSceneEventFilter,但它更有限,因为它也要求处理程序也是QGraphicsItem。

答案 3 :(得分:-1)

如果你是QGraphicsView的子类,你也可以选择重新实现许多...Event()函数。在这种情况下,您不需要eventfilter。